关于Hibernate的ID生成策略总结
一 使用XML映射文件生成ID的时候
<id name="Key" column="pid" type="string">
<generator class="uuid"/>
</id>
Generator有四个值可选择: native, uuid, identity,sequence.
Native: id可以自增,
二 使用Annotation的时候生成ID
1 @ID (设为id,一般在属性得到get方法上面,也可以在属性上面)
2 @Generatorvalue设置ID的值,有四个值选择
A Generatorvalue (strategy=GenerationType.Auto)这个也是默认的值,并且这个值支持所有的数据库
B Generatorvalue(strategy=GenerationType.IDENTITY) 只支持在MySQL中或SQLSERVER这种支持IDENTITY的数据库中
C Generatorvalue(strategy=GenerationType.SEQUENCE) 支持orcal数据库
D Table的ID生成,很少用
@javax.persistence.TableGenerator(
name="student",
table="GENERATOR_TABLE",
pkColumnName = "pk_value",
pkColumnValue = "Teacher",
allocationSize = 1
)
Generatorvalue(strategy=GenerationType.TABLE generator=”student”)
使用该方法可以跨数据库
三 联合主键
1 在映射文件的xml中设置联合主键时:
<composite-id name="pk" class="StudentPK">
<key-property name="id"/>
<key-property name="name"/>
</composite-id>
2 使用Annotation的时候:
A 在创建的主键类中加@Embeddable
@Embeddable //联合主键
public class StudentPK implements java.io.Serializable{
}
然后在主键类的属性get方法上加@ID
@Id //联合主键
public StudentPK getPk() {
return pk;
}
B 在主键类的属性get方法上加@EmbeddedId
@EmbeddedId //联合主键
public StudentPK getPk() {
return pk;
}
C
@IdClass(StudentPK.class)
public class Student {
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Basic //默认的,加不加无所谓
@Id
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这种方法不用new主键类
3 以上两种方法必须创建主键类,并且在主键类中实现implements java.io.Serializable 借口,因为要把主键类序列化,这样就可以一下子放在硬盘上,或通过网络传送给他人;
并且在主键类中复写equals, hashCode 方法,因为equals确保一致性,hashCode获得hash码
例如
package com.bean;
import javax.persistence.Embeddable;
import javax.persistence.GeneratedValue;
//@Embeddable //联合主键
public class StudentPK implements java.io.Serializable{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o){
if(o instanceof StudentPK) {
StudentPK pk = (StudentPK)o;
if(this.id==pk.getId()&&this.name==pk.getName()){
return true;
}
}
return false;
}
@Override
public int hashCode() {
return this.name.hashCode();
}
}

浙公网安备 33010602011771号