使用Spring Data JPA中的Annotations连接两个以上的表

Kau*_*l28 9 java database hibernate spring-data-jpa spring-boot

我有三个实体:A,B和C,以及它们之间的关系如下:

class A{
    @ManyToMany
    List<B> bs;
    //other attributes and getter setters
}

class B{

    @ManyToMany
    List<C> cs;
    //other attributes and getter setters
}

class C{
    //other attributes and getter setters
}
Run Code Online (Sandbox Code Playgroud)

但是从我当前的实体类中,我可以使用任何2个表之间建立关系@JoinTable.但我想要的是在一个单独的表中保存所有3个实体之间的关系,将这些实体的主键作为列.(外键)

如果我们假设实体B并且C已经保存(插入)到数据库中,我插入新的实体A如下:

A:{
  "A_id": 1
  B:[
    "B_id": 1
    {
      C:[
          {"C_id": 1}, {"C_id": 2}
        ]
    }, 
    {
      "B_id": 2
      C:[
          {"C_id": 2}
        ]
     }
  ]
}
Run Code Online (Sandbox Code Playgroud)

然后A应该保存在它的表中,关系应该列在一个单独的表中,如下所示:

A_id    B_id    C_id
=====================
 1       1       1
 1       1       2
 1       2       2
Run Code Online (Sandbox Code Playgroud)

我在这里看到的一个相关问题.但我觉得我的情况是不同的,因为我有很多的所有实体之间的许多关系A,B和C.

我不是要求完整的代码.只要它解决了目的,任何方法或确切参考都将是正确的.谢谢

编辑:

我已经尝试实现答案中提到的单独关系表.但是,这种方法的问题是,当我从关系表中删除行,这也将删除的连接表项B和C.(影响实体的上次关系B和C)

此外,在更新更新行时,它会更改(执行插入)到实体的连接表B和C.这不是预期的行为.我希望这个表只存储实体之间的关系,而不是改变这些实体之间的先前关系.

以下是我的新关系表:

@Entity
@Table(name = "relation_table")
public class RelationEntity {

    @Id
    @Column(name = "pk_relation_id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Integer relatoinId;

    @OneToOne
    @JoinColumn(name = "a_id")
    private A a;

    @OneToOne
    @JoinColumn(name = "b_id")
    private B b;

    @OneToOne
    @JoinColumn(name = "c_id")
    private C c;

    //getter and setters
}
Run Code Online (Sandbox Code Playgroud)

Usa*_*jad 6

如果你想保留relation在单独的表中,那么你可以简单地做这样的事情来保存primary keys

@Entity
@Table(name = "relation_bridge")
public class RelationBridge {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "a")
    private A a;

    @ManyToOne
    @JoinColumn(name = "b")
    private B b;

    @ManyToOne
    @JoinColumn(name = "c")
    private C c;

    //getters & setters
}
Run Code Online (Sandbox Code Playgroud)

编辑

当我从关系表中删除行,这也将删除的连接表项> B和C.(影响>实体的上次关系B和C)

除非明确定义,否则上述解决方案不应该delete是表中的条目parent.但是,您可能在其他类中使用其他映射,因此可以通过在映射中应用Cascading来控制此行为.

JPA和Hibernate级联类型的初学者指南

适合初学者的好读物