一、 主键生成策略
策略名 | 说明 |
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. |
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 ,一个唯一的字符串
![](https://img2018.cnblogs.com/blog/1665938/201908/1665938-20190814135117388-1430129600.png)
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(); } }