我有三个实体: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
}
但是从我当前的实体类中,我可以使用
@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}
]
}
]
}
然后,
A
应该保存在其表中,并且关系应在单独的表中列出,如下所示:A_id B_id C_id
=====================
1 1 1
1 1 2
1 2 2
我见过的一个相关问题here。但是我认为我的情况有所不同,因为我在所有实体
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
}
最佳答案
如果您想将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
}
编辑
除非明确定义,否则上述解决方案不应对
delete
表中的条目进行parent
。但是,您可能在其他类中使用其他映射,因此可以通过在映射中应用Cascading来控制此行为。A Beginner's Guide to JPA and Hibernate Cascade Types
Good read for beginners