JPA複合主鍵另一種實現--聯合約束
阿新 • • 發佈:2019-02-10
前言
關於複合主鍵一般是三種方式,但必須建立複合主鍵類,然後通過註解的方式完成,這三種方式網上很容易找到,這裡主要記錄自己使用時的一些坑和專案中的特殊需求。
結合JPA使用時,關於Repository類中第二個引數不再是Long(主鍵id型別),而是複合主鍵類名
public interface XxxRepository extends JpaRepository<Xxx,XxxPK> { }
主鍵類中必須有無參構造器及重寫hashcode和equals方法
findBy時可以直接查詢具體的主鍵引數名,而不是複合主鍵類名
重點
特殊需求:
無論使用id單一主鍵還是複合主鍵,都只能存在一種,也就是一個類中不能存在兩個主鍵
我的需求是仍然以id為主鍵,但是其中某幾個屬性分別相同時是不允許的,也就相當於這幾個屬性構成了複合主鍵,比如一下Person類,主鍵是id,但當某兩個person例項中的firstName和lastName分別相同時是無法儲存的,相當於這倆引數構成了複合主鍵
@Entity @Table(name="PERSON") public class Person{ @Id private Long id; private String firstName; private String lastName; // get,set.... }
分析:id不能和firstName,lastName一起構成複合主鍵,否則id不同時其它兩個引數可以分別相同,沒有完成業務的需求,複合主鍵三種方式無法滿足需求。
解決方式:使用聯合約束,在類名的@Table註解上加入下面的引數即可
uniqueConstraints = {@UniqueConstraint(columnNames={"username", "tenant"})}
@Entity @Table(name="PERSON",uniqueConstraints = {@UniqueConstraint(columnNames={"firstName", "lastName"})}) public class Person{ @Id private Long id; private String firstName; private String lastName; // get,set....
@UniqueConstraints
可以定義表的約束。如果是聯合約束就這樣使用@Table(name="PERSON",uniqueConstraints = {@UniqueConstraint(columnNames={"firstName", "lastName"})})
一開始認定是複合主鍵,嘗試了很多次都無法滿足這種不捨棄單一主鍵id的情況,後來百度到名為Davy_shark
大神的方法,果斷解決,感謝!
另外JPA中使用複合主鍵感覺會比較麻煩,在查詢的時候要根據具體使用哪種複合主鍵方式去進行實體的相應CRUD寫法。