版本:hibernate-3.2.7
方法之一: 用uuid產生唯一的主鍵, 用這種方法,如果對象的id為null,儲存時會自動產生一個UUID,如果id不為null,儲存時會從資料庫中找出這條記錄,然後執行update,如果未找到是拋出異常。
Xxxclass.hbm.xml代碼
- <id name="id" type="java.lang.String" column="ID">
- <generator class="uuid.hex" />
- </id>
Xxxclass.java代碼
- 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。
Xxxclass.hbm.xml代碼
- <id name="id" type="java.lang.String" column="ID">
- <generator class="AssignCopiedId" />
- </id>
Xxxclass.java代碼
- 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;
- }
- }
Assignedidmodel.java代碼
- public interface AssignedIdModel {
-
- public String getAssignedId();
-
- }
Assigncopiedid.java代碼
- 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);
- }
- }
- }
總結: 兩種方法相比之下,方法一比較簡單,能滿足一般情況,項目中用的比較多。方法一無法處理時才用方法二,例如從其它系統資料庫複製表的記錄時用。