Hibernate 主键 ID 生成方式

ID生成方式

序列sequence 只适用于Oracle

1
2
3
4
5
<id name="id" column="id">
<generator class="sequence">
<param name="sequence">person_seq</param><!--指定sequence名-->
</generator>
</id>

自增列,适用于SQLServer、MySql

1
2
3
<id name="id" column="id">
<generator class="identity"/>
</id>

取最大值加一 max()+1

1
2
3
<id name="id" column="id" type="integer">
<generator class="increment"/>
</id>

根据底层数据库指定生成方法

1
2
3
<id name="id" column="id">
<generator class="native"/>
</id>

使用缺省策略
针对Oracle数据库的生成方式还是sequence,只不过需要一个特定名字的sequence,”hibernate_sequence”。

高低位算法

1
2
3
4
5
6
7
8
9
10
<id name="id" column="id">
<generator class="hilo">
<param name="table">high_value</param>
<!--设置高位值取值的表-->
<param name="column">next_value</param>
<!--设置高位值取值的字段-->
<param name="max_lo">50</param>
<!--指定低位最大值,当取道最大值是会再取一个高位值再运算-->
</generator>
</id>

Oracle数据库注解 sequence 数据库序列定义

1
2
3
4
5
@SequenceGenerator(name = "sequenceInfo", sequenceName = "SEQ_name")
@GeneratedValue(generator = "sequenceInfo")
@Id
@Column
private Integer id;

SEQ_name 为Oracle数据库序列名

Oracle数据库XML sequence 数据库序列定义

1
2
3
4
5
6
7
8
9
10
11
12
13
<!--package为命名空间 子节点有多个类的全在com.entity包里-->
<!--(如果不写,下面 <class name="Emp" name值"Emp"需要改成全限定类名(绝对路径)"com.entity.Emp")-->
<hibernate-mapping package="com.entity">
<class name="Emp" table="emp">
<!--主键-->
<id name="id">
<!--自增方式-->
<generator class="sequence">
<param name="sequence">SEQ_name</param>
</generator>
</id>
</class>
</hibernate-mapping>