1. 程式人生 > >JPA複合主鍵另一種實現--聯合約束

JPA複合主鍵另一種實現--聯合約束

前言

關於複合主鍵一般是三種方式,但必須建立複合主鍵類,然後通過註解的方式完成,這三種方式網上很容易找到,這裡主要記錄自己使用時的一些坑和專案中的特殊需求。

  • 結合JPA使用時,關於Repository類中第二個引數不再是Long(主鍵id型別),而是複合主鍵類名

    public interface XxxRepository extends JpaRepository<Xxx,XxxPK> {
    }
  • 主鍵類中必須有無參構造器及重寫hashcode和equals方法

  • findBy時可以直接查詢具體的主鍵引數名,而不是複合主鍵類名

重點

  • 特殊需求:

    1. 無論使用id單一主鍵還是複合主鍵,都只能存在一種,也就是一個類中不能存在兩個主鍵

    2. 我的需求是仍然以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....
      }
    3. 分析:id不能和firstName,lastName一起構成複合主鍵,否則id不同時其它兩個引數可以分別相同,沒有完成業務的需求,複合主鍵三種方式無法滿足需求。

    4. 解決方式:使用聯合約束,在類名的@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....
      }
    5. @UniqueConstraints 可以定義表的約束。如果是聯合約束就這樣使用@Table(name="PERSON",uniqueConstraints = {@UniqueConstraint(columnNames={"firstName", "lastName"})})

一開始認定是複合主鍵,嘗試了很多次都無法滿足這種不捨棄單一主鍵id的情況,後來百度到名為Davy_shark大神的方法,果斷解決,感謝!
另外JPA中使用複合主鍵感覺會比較麻煩,在查詢的時候要根據具體使用哪種複合主鍵方式去進行實體的相應CRUD寫法。