JPA 複合主鍵
阿新 • • 發佈:2021-10-13
參考連結:https://www.cnblogs.com/boywwj/p/8031106.html、https://www.cnblogs.com/lich/archive/2011/12/03/2274672.html
1.複合主鍵定義:
一張表存在多個欄位共同組成一個主鍵,這多個欄位的組合不能重複,但是單獨一個可以重複。
2.思路:
STEP 1:需求
資料庫中的表沒有主鍵,而是由複合主鍵代替。但專案中所需的程式規定,必須要設定主鍵,即有這樣的標識:
/** 使用者Id*/ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name= "id" ,length = 32) String id;
STEP 2:建立複合主鍵類
但因為專案中設定的是複合主鍵,所以不能使用這樣的形式來設定主鍵,要新建一個複合主鍵類:
import javax.persistence.Column; import javax.persistence.Embeddable; import java.io.Serializable; @Data @Embeddable public class Key implements Serializable { /** 姓 */ @Column(name = "firstName" ,length = 32) String firstName;/** 名 */ @Column(name = "lastName" ,length = 32) String lastName; }
STEP 3:插入複合主鍵
建立複合主鍵類後,將複合主鍵以下列形式寫入程式即可。
import lombok.Data; import javax.persistence.*; @Entity @Data @Table(name = "student") public class Student { /** 姓名的複合主鍵 */ @EmbeddedId private Key id; /** 祖先節點和孫子節點的距離*/ @Column(name = "age" ,length = 11) Integer age; }
使用注意:
1)實現Serializable
介面(否則會報錯,錯誤會直接顯示);
2) 在複合主鍵的類上,使用註解@Embeddable
3) 有預設的public無引數的構造方法(在我這個例項中,我沒有新增有參構造方法,所以採用預設的構造方法)。如果你在實體類裡有有參構造方法,那麼一定要有一個無參構造方法,否則執行的時候會報錯。
4)重寫equals
和hashCode
方法。equals方法用於判斷兩個物件是否相同,EntityManger通過find方法來查詢Entity時,是根據equals的返回值來判斷的。hashCode方法返回當前物件的雜湊碼(我驗證EntityManger,不重寫也沒事。);