hibernate 主键生成策略

Hibernate 部分主键生成策略详解:

              主键由程序员自主控制生成,在你使用会话操作数据库之前必须指定,与hibernate和底层数据库均无关联 。

  1.      assigned 
  1.        <!-- name:类属性  type:类属性类型 column:对应的表列字段 -->
  2.         <id name="sid" type="java.lang.Integer" column="sid">
  3.             <!-- 配置数据库表的主键生成策略 -->        
  4.             <generator class="assigned"></generator>
  5.         </id>  

      特点:可跨数据库,手动设置主键值 

      2.       identity(标识列/自动增长)

               主键由数据库自己控制,但这个主键必须设置为自增长,使用identity的前提条件是底层数据库支持自动增长字段类型,如DB2、SQL Server、MySQL、Sybase和HypersonicSQL等,Oracle这类没有自增字段的则不支持。

  1. <id name="sid" type="java.lang.Integer" column="sid">
  2.             <!-- 配置数据库表的主键生成策略 -->        
  3.             <generator class="identity"></generator>
  4.         </id>

      特点:只能在设置了字段自增长的数据库中使用 

      3.       sequence(序列)

                主键由数据库自己控制,采用数据库提供的sequence机制生成主键,需要数据库支持sequence。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence。MySQL这种不支持sequence的数据库则不行(可以使用identity)。

  1. <generator class="sequence"></generator>

      特点:只能在支持序列机制的数据库中使用

      4.        increment (自增长)

                 主键由hibernate框架控制,hibernate从数据库中取出主键的最大值(每个session只取1次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的数据库,可跨数据库。

  1.  <generator class="increment"></generator>

      特点:可跨数据库,适合单一进程访问数据库

      5.       uuid

                主键由hibernate框架控制,UUID:Universally Unique Identifier, 字段唯一标识值,它可以保证每台机器生成时同一时间的唯一。

  1. <!-- name:类属性  type:类属性类型 column:对应的表列字段 -->
  2.         <id name="wid" type="java.lang.String" column="wid">
  3.             <!-- 配置数据库表的主键生成策略 -->        
  4.             <generator class="uuid"></generator>
  5.         </id>

      特点:可跨数据库,效率高且能保证字段值的唯一 

      6.      native

              由hibernate根据使用的数据库自行判断采用identity、sequence其中一种作为主键生成方式,灵活性很强。

  1.  <generator class="native"></generator>

      特点:根据hibernate方言的自动选择主键的生成策略

     7.      自定义主键生成器

              由开发人员自主编写主键生成的字段,通过实现org.hibernate.id.IdentifierGenerator编写生成器,class里头填写全限定名

  1.  <generator class="com.practice.factory.IdFactory"></generator> 

编写的自定义主键生成器

package com.practice.factory;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;

public class IdFactory implements IdentifierGenerator {

	@Override
	public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
		return "MySelf_create_id_" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
	}

}

     骚年,去感受它的特点吧!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值