Hibernate主键ID自动生成两种方法示例


版本:hibernate-3.2.7

方法之一: 用uuid生成唯一的主键, 用这种方法,如果对象的id为null,保存时会自动生成一个UUID,如果id不为null,保存时会从数据库中找出这条记录,然后执行update,如果未找到是抛出异常。

Xxxclass.hbm.xml代码

  1. <id name="id" type="java.lang.String" column="ID">   
  2.         <generator class="uuid.hex" />   
  3.     </id>  

Xxxclass.java代码

  1. public class XXXClass{   
  2.         /** id */   
  3.         private String id;   
  4.      
  5.         public void setId(String id) {   
  6.         this.id = id;   
  7.     }   
  8.        
  9.     public String getId() {   
  10.         return id;   
  11.     }   
  12. }  

方法之二: 用org.hibernate.id.UUIDHexGenerator生成唯一的主键, 用这种方法,如果对象的id为null,保存时会自动生成一个UUID,如果id不为null,保存时会从数据库中找出这条记录,然后执行update,如果未找则执行insert。

Xxxclass.hbm.xml代码

  1. <id name="id" type="java.lang.String" column="ID">   
  2.         <generator class="AssignCopiedId" />   
  3.     </id>  

Xxxclass.java代码

  1. public class XXXClass implements AssignedIdModel{   
  2.         /** id */   
  3.         private String id;   
  4.      
  5.         public void setId(String id) {   
  6.         this.id = id;   
  7.     }   
  8.        
  9.     public String getId() {   
  10.         return id;   
  11.     }   
  12.   
  13.         @Override   
  14.     public String getAssignedId() {   
  15.         return assignedId;   
  16.     }   
  17.   
  18.     public void setAssignedId(String assignedId) {   
  19.         this.assignedId = assignedId;   
  20.     }   
  21. }  

Assignedidmodel.java代码

  1. public interface AssignedIdModel {   
  2.        
  3.     public String getAssignedId();   
  4.   
  5. }  

Assigncopiedid.java代码

  1. import org.hibernate.engine.SessionImplementor;   
  2. import org.hibernate.id.UUIDHexGenerator;   
  3.   
  4. public class AssignCopiedId extends UUIDHexGenerator {   
  5.     public Serializable generate(SessionImplementor session, Object obj) {   
  6.         if (obj instanceof AssignedIdModel   
  7.                 && (((AssignedIdModel) obj).getAssignedId() != null    
  8.                     && ((AssignedIdModel) obj).getAssignedId().trim().length() > 0)) {   
  9.             return ((AssignedIdModel) obj).getAssignedId();   
  10.         } else {   
  11.             return super.generate(session, obj);   
  12.         }   
  13.     }   
  14. }  

总结: 两种方法相比之下,方法一比较简单,能满足一般情况,项目中用的比较多。方法一无法处理时才用方法二,例如从其它系统数据库复制表的记录时用。

相关内容