Hibernate 注解方式設(shè)置聯(lián)合主鍵

使用 Annotation 設(shè)置聯(lián)合主鍵有三種方式:

1. 方法一

  • 主鍵類:將聯(lián)合主鍵的字段單獨放在類中,該類實現(xiàn) java.io.Serializable 接口,并重寫 equals 和 hascode,再將該類注解為 @Embeddable

  • 實體類:該類不包含聯(lián)合主鍵類中的字段,但保存聯(lián)合主鍵類的引用,并生成 set 和 get 方法,并將該引用注解為 @Id

實體類:

@Entity 
@Table(name="Test01")  
public class Test01 implements Serializable{  
   private static final long serialVersionUID = 3524215936351012384L;  
   private String address ;  
   private int age ;  
   private String email ;  
   private String phone ;  
   @Id
   private TestKey01 testKey ;
}

主鍵類:

@Embeddable  
public class Testkey01  implements Serializable{
private static final long serialVersionUID = -3304319243957837925L;  
private long id ;  
private String name ;  
 
public long getId() {  
    return id;  
}  

public void setId(long id) {  
    this.id = id;  
}  

public String getName() {  
    return name;  
}  

public void setName(String name) {  
    this.name = name;  
}  

@Override  
public boolean equals(Object o) {  
    if(o instanceof Testkey0101){  
        Testkey01 key = (TestKey01)o ;  
        if(this.id == key.getId() && this.name.equals(key.getName())){  
            return true ;  
        }  
    }  
    return false ;  
}  
  
@Override  
public int hashCode() {  
    return this.name.hashCode();  
}
}

2. 方法二

  • 主鍵類:將聯(lián)合主鍵的字段單獨放在一個類中,該類需要實現(xiàn) java.io.Serializable 接口,并重寫 equals 和 hascode

  • 實體類:該類不包含聯(lián)合主鍵類中的字段,但保存該聯(lián)合主鍵類的一個引用,并生成 set 和 get 方法,并將該引用注解為 @EmbeddedId

@Entity
@Table(name="Test02")
public class Test02 {
    private String address;
    private int age;
    private String email;
    private String phone;
    
    @EmbeddedId
    private TestKey02 testKey ;
}

注:Testkey02為普通 Java 類即可。

3. 方法三

  • 主鍵類:將聯(lián)合主鍵的字段單獨放在一個類中,該類需要實現(xiàn) java.io.Serializable 接口并要重寫 equals 和 hashcode

  • 實體類:該類包含聯(lián)合主鍵類中的字段,將聯(lián)合主鍵字段都注解為 @Id,并在該類上方加上注解:@IdClass(聯(lián)合主鍵類.class)

@Entity  
@Table(name="Test03")  
@IdClass(TestKey03.class)  
public class Test03 {  
    @Id
    private long id ;
    @Id  
    private String name ; 
}

Testkey03為普通Java類即可。

注:

  • 主鍵類都需要實現(xiàn) java.io.Serializable 接口,并重寫 equals 和 hashcode;
  • Serializable接口 原因是:序列化就是為了能暫存一些對象到硬盤中;
  • 重寫 equals函數(shù) , 原因是:內(nèi)存中的對象區(qū)分;
  • 重寫 hashCode 函數(shù), 原因是:根據(jù)哈希碼快速索引;
  • 3 種之中最適合的書寫習(xí)慣的是第 3 種,但是第 2 種比較方便,也很常用。

參考鏈接:
https://www.cnblogs.com/lcngu/p/5854864.html
https://blog.csdn.net/zj420964597/article/details/77918357

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • JPA Java Persistence API----java持久化接口 Hibernate注解分類 類級別注解...
    蕊er閱讀 625評論 0 2
  • 【小young聲明】為了感謝你這一次的點擊閱讀,我向你保證我所寫的一定是對你有用的。 有的人可以用8小時完成2天的...
    young觀點閱讀 812評論 2 1
  • 昨晚放學(xué),還沒見到人,就聽見小郭在電話里要求讓給他買個雞排慶祝一下今天數(shù)學(xué)測驗得了99分。我說:我考慮一下,等見面...
    你今天怎么樣閱讀 342評論 0 0
  • 1 上星期去兄弟學(xué)校監(jiān)考,考數(shù)學(xué)時,我跟同事湊在一起小聲談?wù)撝?,昨晚發(fā)生的事情。 說時...
    美麗99_8e9c閱讀 539評論 0 1
  • dscf is
    MOCP閱讀 227評論 0 0

友情鏈接更多精彩內(nèi)容