1. 程式人生 > >Hibernate註解對映聯合主鍵的三種主要方式

Hibernate註解對映聯合主鍵的三種主要方式

聯合主鍵用Hibernate註解對映方式主要有三種:
第一、將聯合主鍵的欄位單獨放在一個類中,該類需要實現java.io.Serializable介面並重寫equals和hascode,再將該類註解為@Embeddable,最後在主類中(該類不包含聯合主鍵類中的欄位)儲存該聯合主鍵類的一個引用,並生成set和get方法,並將該引用註解為@Id

第二、將聯合主鍵的欄位單獨放在一個類中,該類需要實現java.io.Serializable介面並重寫equals和hascode,最後在主類中(該類不包含聯合主鍵類中的欄位)儲存該聯合主鍵類的一個引用,並生成set和get方法,並將該引用註解為@EmbeddedId

第三、將聯合主鍵的欄位單獨放在一個類中,該類需要實現java.io.Serializable介面並要重寫equals和hashcode.最後在主類中(該類包含聯合主鍵類中的欄位)將聯合主鍵欄位都註解為@Id,並在該類上方將上這樣的註解:@IdClass(聯合主鍵類.class)

使用方式:

1、model類:

  1. @Entity  
  2. @Table(name="JLEE01")  
  3. public class Jlee01 implements Serializable{  
  4.     private static final long serialVersionUID = 3524215936351012384L;  
  5.     private String address ;  
  6.     private int age ;  
  7.     private String email ;  
  8.     private String phone ;  
  9. @Id
  10.     private JleeKey01 jleeKey ; 
主鍵類:JleeKey01.java
  1. @Embeddable  
  2. public class JleeKey01  implements Serializable{  
  3.     private static final long serialVersionUID = -3304319243957837925L;  
  4.     private long id ;  
  5.     private String name ;  
  6.     /** 
  7.      * @return the id 
  8.      */  
  9.     public long getId() {  
  10.         return id;  
  11.     }  
  12.     /** 
  13.      * @param id the id to set 
  14.      */  
  15.     public void setId(long id) {  
  16.         this.id = id;  
  17.     }  
  18.     /** 
  19.      * @return the name 
  20.      */  
  21.     public String getName() {  
  22.         return name;  
  23.     }  
  24.     /** 
  25.      * @param name the name to set 
  26.      */  
  27.     public void setName(String name) {  
  28.         this.name = name;  
  29.     }  
  30.     @Override  
  31.     public boolean equals(Object o) {  
  32.         if(o instanceof JleeKey01){  
  33.             JleeKey01 key = (JleeKey01)o ;  
  34.             if(this.id == key.getId() && this.name.equals(key.getName())){  
  35.                 return true ;  
  36.             }  
  37.         }  
  38.         return false ;  
  39.     }  
  40.     @Override  
  41.     public int hashCode() {  
  42.         return this.name.hashCode();  
  43.     }  
  44. }  
2、model類:
  1. @Entity  
  2. @Table(name="JLEE02")  
  3. public class Jlee02 {  
  4.     private String address ;  
  5.     private int age ;  
  6.     private String email ;  
  7.     private String phone ;  
  8.     @EmbeddedId
  9.     private JleeKey02 jleeKey ;  

主鍵類:JleeKey02.java

普通java類即可。

3、model類:
  1. @Entity  
  2. @Table(name="JLEE03")  
  3. @IdClass(JleeKey03.class)  
  4. public class Jlee03 {  
  5.     @Id
  6.     private long id ;
  7.     @Id  
  8.     private String name ;  
主鍵類:JleeKey03.java

普通java類。

主鍵類都需要實現重寫equals和hascode方法,至於是否需要實現implements Serializable介面,測試了下,貌似可以不需要。

前端如果用easyui的 話,

需要這樣寫:

 {field:'joinKey.statistic_id',title:'編號',width:80,sortable:true,align:'center',
            formatter:function(value,rowData,rowIndex){
                    
                 return rowData.joinKey.statistic_id;
                  
              }},

 {field:'joinKey.month',title:'時間(單位月)',width:200,sortable:true,align:'center',
            formatter:function(value,rowData,rowIndex){
                    
                 return rowData.joinKey.month;
                  
              }}

joinKey為主鍵類,statistic_id、month為聯合主鍵的欄位。