【问题标题】:How to implements entity with 2 entity as primary key with jpa annotation and repository如何使用 jpa 注释和存储库实现具有 2 个实体作为主键的实体
【发布时间】:2022-09-27 15:34:49
【问题描述】:

我想在其中实现与数量信息的多对多关联。像这样 :

@Entity
@Table(name = \"reserves\")
@Getter @Setter @NoArgsConstructor
public class Reserve {
    @Id
    @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinColumn(name = \"groupe_id\")
    private GroupeSanguin bloodGroup;
    @Id
    @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    private Banque banque;
    private int quantity;
}

GroupSanguin 和 Banque 是两个存储在数据库中的类。如果需要,这是两者的代码:

@Entity
@Table(name = \"groupe_sanguins\")
public class GroupeSanguin {
    @Id
    private String groupe;
    @OneToMany(mappedBy = \"groupeSanguin\")
    private List<Donneur> donneurs;
}
@Entity @Getter @Setter @NoArgsConstructor
public class Banque {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(unique = true,nullable = false)
    private String nom;
    private String adresse;
    @Column(unique = true)
    private String telephone;
    private String localisation;
}

所以我想知道如何注释 JpaRepository 以将两者作为主键,这样我的注释是否适合它的工作?

public interface ReserveRepository extends JpaRepository<
Reserve,
//what to put here ?
>

    标签: spring hibernate jpa spring-annotations jparepository


    【解决方案1】:

    实际上,这不是 JPA 问题,而是关系数据库概念。 如果 Reserve has 是自己的数据并与它拥有的其他实体链接自己的身份证您可以添加唯一性约束

    @Entity
    @Table(name = "reserves", uniqueConstraints={
    @UniqueConstraint(columnNames = {"banque_id", "groupe_id"})
    @Getter @Setter @NoArgsConstructor
    public class Reserve {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
       
    
    @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinColumn(name = "groupe_id")
    private GroupeSanguin bloodGroup;
       
    @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinColumn(name = "banque_id")
    private Banque banque;
    private int quantity;
    

    }

    【讨论】:

      【解决方案2】:

      我也找到了这个解决方案。

      @Entity
      @Table(name = "reserves")
      @Getter @Setter @NoArgsConstructor
      @IdClass(ReserveId.class) //this annotation will tell that id that the 
      // the id will be represented by a class
      public class Reserve {
          @Id
          @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
          @JoinColumn(name = "groupe_id")
          private GroupeSanguin groupeSanguin;
          @Id
          @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
          @JoinColumn(name = "banque_id")
          private Banque banque;
          private int quantity;
      }
      

      并且 id 类应该像这样实现 Serializable :

      @Getter @Setter
      public class ReserveId implements Serializable {
          private Banque banque;
          private GroupeSanguin groupeSanguin;
      }
      

      最后存储库将是这样的:

      @Repository
      public interface ReserveRepo extends JpaRepository<Reserve, ReserveId>{}
      

      【讨论】:

      • 是的,这也是一个解决方案。但是,如果另一个实体链接到 Reserve 实体,您将需要 2 列来进行链接。
      • 如果有另一个实体作为 id,我不知道你在说什么?
      • 不,相同的实体使用具有 FK,但它需要 2 列。
      【解决方案3】:

      看到你的 Reserve 类没有提到复合主键。首先你需要修复模型,你可以参考这里的解决方案How to create and handle composite primary key in JPA

      【讨论】:

        猜你喜欢
        • 2019-04-21
        • 2015-08-14
        • 1970-01-01
        • 2018-12-27
        • 2017-12-11
        • 2014-12-23
        • 1970-01-01
        • 2014-02-19
        • 2017-11-30
        相关资源
        最近更新 更多