Hibernate主键生成策略

 
一、 主键生成策略
策略名 说明
increment                    increment策略是指,不使用数据库本地的自增长策略,而是由程序(Hibernate框架)产生一个自增长的ID值,赋予数据库.
idenitty identity策略,指定必须使用数据库里面的ID自增长策略. 只能用于支持ID自增长功能的数据库,如:MySQL,SQLServer.. 不支持没有ID自增长策略的数据库,如Oracle,DB2..
sequence  使用序列的实现ID生成策略,主要用于有序列的数据库.如:Oracle,DB2,如果不支持序列的数据库(如:MYSQL),该策略会使用一个表模拟序列。
native

使用数据库本地的策略,就是数据库里面使用怎么样的策略就用什么策略,HIbernate不做任何的判断.如:MySQL数据库使用了increment_auto,自增长策略.使用native.表示直接调用数据库里面的increment_auto策略.

uuid     就是数据库的主键是使用一个唯一的字符串的来存储.这个唯一的字符串就是UUID
assigned assigned策略,就是不使用主键生成策略,由手工输入ID.
1.1 increment生成策略
 
increment策略是指,不使用数据库本地的自增长策略,而是由Hibernate框架产生一个自增长的ID值,赋予数据库的主键。
好处:兼容好,可以支持各种数据库。
缺点:由于框主键值由架生成,所以效率相对低。
1.2   注意事项:应用场景:适合一些需要支持多种数据库的产品型项目。
--生成的数据库表结构,是没有使用数据库自带的主键自增长的
 
 
 
--控制台输出
--根据分析,得出:数据库会每一次使用max获得主键列的最大值加1
 
 
 
 
2  identity 生成策略(重要)
identity策略,指定使用数据库里面的ID自增长策略. 只能用于有ID自增长功能的数据库,如:MySQL,SQLServer.. 不支持没有ID自增长策略的数据库,如Oracle,DB2..
好处:默认就认为数据库是使用ID自增长策略,效率高
缺陷:兼容差。不支持使用序列实现ID自增长的数据库
 
3 .  native 生成策略
使用数据库本地的策略,就是数据库里面使用怎么样的策略就用什么策略,HIbernate不做任何的判断.如:MySQL数据库使用了increment_auto,自增长策略.如果Oracle使用native就使用序列生成主键值。
 
4.1 .  sequence  生成策略
一般用于支持序列的数据库,如ORACLE。
4.2    配置信息
 
  <!-- 主键生成策略
              数据库的主键值可以很多种生成方式,HIbernate通过主键生成策略来指定其中一种
              sequence策略,主要用于有序列的数据库
            -->
            <!-- 通过org.hibernate.id.enhanced.SequenceStyleGenerator 找参数-->
            <generator class="sequence">
               <!--
               sequence_name:用于设置序列名
               initial_value:序列开始位置
               increment_size:步长
                -->
               <param name="sequence_name">seq_student</param>
            </generator>
        </id>
 
5   UUID生成策略
 
5.1 说明
 
UUID主要用于存储基础数据的表。所谓的基础数据,就是系统必须依赖的数据。
就是数据库的主键是使用一个唯一的字符串的来存储.这个唯一的字符串就是UUID。
 
应用场景:
有几个开发人员同时开发一个项目。前提每个开发人员使用的都是自己电脑的数据库。
 如果使用ID自增长作为ID列的值,就会导致每个人的数据的ID值冲突。
 但是如果大家使用UUID。那么冲突的概率,极小。
5.2  配置信息
 
在xxx.hbm.xml id中配置
     <id name="stuId" column="stu_id">
       <!--
        uuid策略:就是数据库的主键是使用一个唯一的字符串的来存储
        -->
       <generator class="uuid"></generator>
     </id>
注意事项:--实体类,主键列必须是字符串类型
 
    
--生成的表结构
--可以看到,存储的记录的主键列的值为一个UUID ,一个唯一的字符串
 
 
 
 
 
6  assinged主键生成策略
 
  assigned策略:就是不使用主键自动生成值的策略,需要手工写入ID的值
public void save(){
       //1.获得操作对象
       Session session = HibernateUtils.getSession();
       //2.打开事务,操作都需要打开事务(增删改)
       Transaction transaction = session.beginTransaction();
       //3.操作
       Student s=new Student();
       s.setStuName("李四");
        //assigned策略,必须需要手工写入ID的值。
       s.setStuId(1L);
       session.save(s);
       //4.提交事务
       transaction.commit();
       //5.关闭操作类对象session
       session.close();
    }
 
}
 
原文地址:https://www.cnblogs.com/aknife/p/11344601.html