方法之一: 用uuid生成唯一的主键, 用这种方法,如果对象的id为null,保存时会自动生成一个UUID,如果id不为null,保存时会从数据库中找出这条记录,然后执行update,如果未找到是抛出异常。
<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; } }
方法之二: 用org.hibernate.id.UUIDHexGenerator生成唯一的主键, 用这种方法,如果对象的id为null,保存时会自动生成一个UUID,如果id不为null,保存时会从数据库中找出这条记录,然后执行update,如果未找则执行insert。
<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); } } }
总结: 两种方法相比之下,方法一比较简单,能满足一般情况,项目中用的比较多。方法一无法处理时才用方法二,例如从其它系统数据库复制表的记录时用。