[size=medium]版本:hibernate-3.2.7
[color=green]方法之一: 用uuid生成唯一的主键, 用这种方法,如果对象的id为null,保存时会自动生成一个UUID,如果id不为null,保存时会从数据库中找出这条记录,然后执行update,如果未找到是抛出异常。[/color][/size]
[size=medium][color=green]方法之二: 用org.hibernate.id.UUIDHexGenerator生成唯一的主键, 用这种方法,如果对象的id为null,保存时会自动生成一个UUID,如果id不为null,保存时会从数据库中找出这条记录,然后执行update,如果未找则执行insert。[/color][/size]
[size=medium]
[color=green]总结: 两种方法相比之下,方法一比较简单,能满足一般情况,项目中用的比较多。方法一无法处理时才用方法二,例如从其它系统数据库复制表的记录时用。[/color][/size]
[color=green]方法之一: 用uuid生成唯一的主键, 用这种方法,如果对象的id为null,保存时会自动生成一个UUID,如果id不为null,保存时会从数据库中找出这条记录,然后执行update,如果未找到是抛出异常。[/color][/size]
<id name="id" type="java.lang.String" column="ID">
<generator class="uuid.hex" />
</id>
public class XXXClass{
/** id */
private String id;
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
}
[size=medium][color=green]方法之二: 用org.hibernate.id.UUIDHexGenerator生成唯一的主键, 用这种方法,如果对象的id为null,保存时会自动生成一个UUID,如果id不为null,保存时会从数据库中找出这条记录,然后执行update,如果未找则执行insert。[/color][/size]
<id name="id" type="java.lang.String" column="ID">
<generator class="AssignCopiedId" />
</id>
public class XXXClass implements AssignedIdModel{
/** id */
private String id;
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
@Override
public String getAssignedId() {
return assignedId;
}
public void setAssignedId(String assignedId) {
this.assignedId = assignedId;
}
}
public interface AssignedIdModel {
public String getAssignedId();
}
import org.hibernate.engine.SessionImplementor;
import org.hibernate.id.UUIDHexGenerator;
public class AssignCopiedId extends UUIDHexGenerator {
public Serializable generate(SessionImplementor session, Object obj) {
if (obj instanceof AssignedIdModel
&& (((AssignedIdModel) obj).getAssignedId() != null
&& ((AssignedIdModel) obj).getAssignedId().trim().length() > 0)) {
return ((AssignedIdModel) obj).getAssignedId();
} else {
return super.generate(session, obj);
}
}
}
[size=medium]
[color=green]总结: 两种方法相比之下,方法一比较简单,能满足一般情况,项目中用的比较多。方法一无法处理时才用方法二,例如从其它系统数据库复制表的记录时用。[/color][/size]