使用实体的复合键作为另一个实体中的 ManyToMany 键

Posted

技术标签:

【中文标题】使用实体的复合键作为另一个实体中的 ManyToMany 键【英文标题】:Use a Composite key of an entity as the ManyToMany key in another entity 【发布时间】:2020-10-16 21:07:20 【问题描述】:

我有以下情况,我正在尝试像用户和用户所属的所有团队一样进行多对多映射。

    Class AID
       private int b
       private int c
    
    @IdClass(AID.class)
    Class A
   
      @Id
      @SequenceGenerator(name = "b_seq", sequenceName = "id_seq", allocationSize = 1)
      @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "b_seq")
      private int b
    
      @Id
      @Column(name = "col_c")
      private int c
    
    Class D
    #need to define a many to many mapping with A here

假设 D 类是 Teams 类,而 A 类有一个复合键作为主键,我将如何进行?

【问题讨论】:

【参考方案1】:

我使用的是 MSSQL,似乎需要实际指定 referencedColumnName。

所以如果D类如下

Class D
 @Id
 private int e
 @ManyToMany
 @JoinTable(
          name = "d_a_info",
          joinColumns = 
              @JoinColumn(name = "e", referencedColumnName = "e"),
          ,
          inverseJoinColumns =  
              @JoinColumn(name = "b", referencedColumnName = "b"),
              @JoinColumn(name = "c", referencedColumnName = "c")
          
  )
 private Set<A> setOfA= new HashSet<>();

在 AID 类中我也不得不手动设置 getter 方法

 @Column(name = "b", nullable = false)
  public String getB() 
    return this.b;
  

 @Column(name = "c", nullable = false)
  public String getC() 
    return this.c;
  

【讨论】:

以上是关于使用实体的复合键作为另一个实体中的 ManyToMany 键的主要内容,如果未能解决你的问题,请参考以下文章

如何进行 Hibernate XML 映射,一对多使用 1 PK 映射到另一个具有复合键的实体

Hibernate 对具有复合键的子实体执行错误的插入顺序

在 JPA 中使用继承时的复合外键问题

使用复合键保存实体获取 ConversionNotSupportedException

级联保存具有外键的实体对象作为复合主键的一部分

Spring Boot:如何使用复合键创建实体