4.ID主键生成策略
Posted 白日梦想家12138
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4.ID主键生成策略相关的知识,希望对你有一定的参考价值。
保证唯一性(auto_increment)
一、xml方式
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 6 <hibernate-mapping package="com.bjsxt.hibernate.model"> 7 <class name="Student" table="t_student" dynamic-update="true"> 8 <id name="id" > 9 <generator class="native"></generator> 10 </id> 11 12 <property name="name"></property> 13 </class> 14 </hibernate-mapping>
<id> 标签必须配置在 <class>标签内第一个位置。由一个字段构成主键,如果是复杂主键<composite-id> 标签
<generator> 元素 (主键生成策略)
如:<generator class="native"/> 根据是什么数据库,自动选择,mysql默认是 ‘identity‘ 即 auto_increment
<generator class="uuid "/> 用一个128-bit的UUID算法生成字符串类型的标识符 在Mysql类型是 varchar(255)
二、annotation方式
在相应的get方法上使用@GeneratedValues(strategy=GeneratedType)
strategy 取值:如:strategy=GenerationType.AUTO
1.AUTO(默认值) - 可以是identity column类型,或者sequence 类型 或者 table 类型取决于不同的底层数据库 相当于 native
1、对于mysql,使用auto_increment
2、对于oracle使用hibernate_sequence(名称固定)
2.TABLE - 使用表保存id值
就是在数据库中建立一个表,这个表包含两个字段,一个字段表示名称,另一个字段表示值。
每次在添加数据时,使用第一个字段的名称,来取值作为添加数据的ID,然后再给这个值累加一个值再次存入数据库,以便下次取出使用。
@Entity
@javax.persistence.TableGenerator(
name="Teacher_GEN", //生成策略的名称
table="GENERATOR_TABLE", //在数据库生成表的名称
pkColumnName = "pk_key", //表中第一个字段的字段名 类型为varchar,key
valueColumnName = "pk_value", //表中第二个字段的字段名 int ,value
pkColumnValue="teacher", //这个策略中使用该记录的第一个字段的值(key值)
initialValue = 1, //这个策略中使用该记录的第二个字段的值(value值)初始化值
allocationSize=1 //每次使用数据后累加的数值
)
@GeneratedValue(strategy=GenerationType.TABLE,generator="Teacher_GEN")
3.IDENTITY - identity column
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。
返回的标识符是long, short 或者int类型的。 (数据库自增)
注意:此生成策略不支持Oracle
4.SEQUENCE - sequence
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),
而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。(数据库自增)
注意:此生成策略不支持MySQL
联合主键(多个字段构成唯一性)
1 <hibernate-mapping package="com.bjsxt.hibernate.model"> 2 <class name="Student" table="t_student"> 3 <composite-id name="pk" class="com.bjsxt.hibernate.model.StudentPK"> 4 <key-property name="id"></key-property> 5 <key-property name="name"></key-property> 6 </composite-id> 7 8 <property name="age" /> 9 <property name="sex" /> 10 <property name="good" type="yes_no"></property> 11 </class> 12 </hibernate-mapping>
1.xml方式
a)建立复合主键类 (必须实现Serializable接口)
b)在实体类中引用复合主键类
c)student.hbm.xml 映射文件
<composite-id name="studentPK" class=>
<key-property name="id"/>
<key-property name="name"/>
</composite-id>
2.annotation方式
三种方法:一般用 2 3
1 @Entity 2 @Table(name="t_teacher") 3 /*@IdClass(TeacherPK.class)*/ 4 public class Teacher { 5 private int id; 6 private String name; 7 /*private TeacherPK tfk;*/ 8 9 private int age; 10 private String teach; 11 private Date birthday; 12 private Gender gender; 13 /*@EmbeddedId 14 public TeacherPK getTfk() { 15 return tfk; 16 } 17 public void setTfk(TeacherPK tfk) { 18 this.tfk = tfk; 19 }*/
1.将组件类(TeacherPK)注解为 @Embeddable,并将组件的属性(getTPk())注解为@Id
2.将组件的属性 (getTPk()) 注解为 @EmbeddedId
3.将类(Teacher)注解为@IdClass,并将该实体类中所有属于主键的属性都注解为@Id
注:不管哪种方式 联合主键类(如:Teacherpk) 需要
1.实现 Serializable 接口
2.需要重写equals 和 hashCode方法
(Teacher类 存到 DB中 需要保证Teacher对象中联合主键唯一,所以需要有equals和hashCode)
以上是关于4.ID主键生成策略的主要内容,如果未能解决你的问题,请参考以下文章
大家一起撸代码之——Hibernate各种主键生成策略与配置详解