我有一个表A和表C.A - C之间的关系是1 - *因此我有一个查找表B. B存储' id' A和' id' ' C'。
实体:
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,这意味着当我持久化AI类的实体时希望持久化B类的所有实体并且当我持久化BI类的实体时希望持久化所有类的实体下进行。
保存操作:
A a = new A();
B b = someMethodToGetB();
A.setB(B);
save(A);
someMethodToGetB() {
C c = new C();
b.setC(c);
return b;
}
问题: 所有参赛作品均在表格C&#39;中进行。 所有参赛作品均在表格A&#39;中进行。 但表格中的所有条目&#39; B&#39; (查询表)的ID为&#39; A&#39;为null。
CASCADE的保存操作如何工作?在我的情况下,我首先想要表C和A中的条目。并且对于每个条目,查找表中应该有一个条目。这是否可以使用CASCADE以某种方式实现,还是我需要为A和C手动创建实体,然后获取ID并保存在B?
任何人都可以指出我做错了什么或错过了吗?
答案 0 :(得分:0)
我在A类和B类中定义了CASCADE ALL,这意味着 当我坚持A类实体时,我想坚持所有实体 B级当我坚持B级实体时,我希望坚持所有 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;
}
我已经纠正了伪代码中的拼写错误。