有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个表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的实体时,我希望持久化类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都为空

级联保存操作是如何工作的?在我的例子中,我首先希望在表C和A中创建条目。对于每个条目,查找表中都应该有一个条目。这是否可以通过使用级联以某种方式实现,或者我是否需要手动为A和C创建实体,然后获取ID并保存在B中

谁能指出我做错了什么或遗漏了什么


共 (1) 个答案

  1. # 1 楼答案

    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
    所以,你应该根据你的需要设置好所有的关系

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

    我已经纠正了你伪代码中的错误