我有一个表 A 和表 C。A - C 之间的关系是 1 - *,因此我有一个查找表 B。 B 存储 A 的 'id' 和 'C' 的 'id'。
实体:
Class A {
@OneToMany(mappedBy = "A", cascade = CascadeType.ALL)
private List<B> b;
}
Class B {
@ManyToOne
private A a;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id")
private C c;
}
Class C {
@OneToOne(mappedBy = "c")
private B b;
}
我在A类和B类中定义了CASCADE ALL,这意味着当我持久化A类的实体时,我想持久化B类的所有实体,而当我持久化B类的实体时,我想持久化类B的所有实体C.
保存操作:
A a = new A();
B b = someMethodToGetB();
A.setB(B);
save(A);
someMethodToGetB() {
C c = new C();
b.setC(c);
return b;
}
问题: 所有条目均在表“C”中进行。 所有条目均在表“A”中进行。 但表“B”(查找表)中的所有条目的“A”类 ID 均为空。
CASCADE 的保存操作如何进行?就我而言,我首先希望在表 C 和 A 中添加条目。对于每个条目,查找表中都应该有一个条目。这是否可以使用 CASCADE 以某种方式实现,或者我是否需要手动为 A 和 C 创建实体,然后获取 ID 并保存在 B 中?
任何人都可以指出我做错了什么或遗漏了什么吗?
最佳答案
I have defined CASCADE ALL in class A and class B, which means that when I persist an entity of class A I want to persist all entities of class B AND when I persist an entity of class B I want to persist all entities of class C.
Hibernate 不以这种方式工作。
持久化时,如果您持久化关系的所有者实体,则应用级联持久化关系。
在您的情况下,根据您使用的 mappedby
值,所有者是 B。
因此,您应该根据需要保留 B 并设置所有关系。
A a = new A();
B b = someMethodToGetB();
A.setB(B);
save(A);
someMethodToGetB() {
C c = new C();
b.setC(c);
return b;
}
应该是:
B b = someMethodToGetB();
A a = new A();
b.setA(a);
save(b);
someMethodToGetB() {
B b = new B();
C c = new C();
b.setC(c);
return b;
}
我已经更正了您的伪代码中的拼写错误。
关于java - Hibernate级联子对象不在查找表中存储父表的ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41432438/