Hibernate级联子对象不在查找表中存储父表的ID

时间:2017-01-02 19:39:56

标签: java mysql entity-framework hibernate jpa

我有一个表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?

任何人都可以指出我做错了什么或错过了吗?

1 个答案:

答案 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;
}

我已经纠正了伪代码中的拼写错误。