Java Hibernate双向@ManyTone,更新非拥有方不工作

Java Hibernate双向@ManyTone,更新非拥有方不工作,java,hibernate,jpa,jakarta-ee,Java,Hibernate,Jpa,Jakarta Ee,我有一个非常简单的设置来尝试带注释的双向映射: @Entity public class TypeA extends AbstractModel<TypeA> { @Id @GeneratedValue private int id; @OneToMany(mappedBy="a") private Collection<TypeB> bs; // Getters & Setters ... } 如果映射是

我有一个非常简单的设置来尝试带注释的双向映射:

@Entity
public class TypeA extends AbstractModel<TypeA> {

    @Id
    @GeneratedValue
    private int id;

    @OneToMany(mappedBy="a")
    private Collection<TypeB> bs;

    // Getters & Setters ... 
}
如果映射是双向的,则应填充集合并更新b的属性a,但不是。有什么想法吗


编辑谢谢大家的帮助,现在我明白了

对于一致的域模型,应始终设置关系的两侧,如下所示:

TypeB b = new TypeB();

TypeA a = new TypeA();
a.setBs(ListUtils.createList(b));
b.setA(a);   

this.typeBDao.save(b);
this.typeADao.save(a);

当您的实体处于不一致状态时,JPA将始终根据JPA关系所属方的对象状态存储值。在这种情况下,TypeB拥有与TypeA的关系。因此,如果TypeB的对象没有对TypeA的引用,JPA会假定没有定义关系。

这就是它的工作方式:拥有关系的一方是拥有关系的一方,负责在数据库中管理关系。开发人员有责任(即您的责任)确保对象图始终是一致的:如果关系的一侧被修改,那么另一侧也应该被修改


如果您不总是这样做,您必须至少确保修改关系的拥有方,因为Hibernate只关心拥有方。

拥有方是
TypeB
,因此您需要调用
setA()
,因为关联只由拥有方管理。

这是正常的,关于“mappedBy”和“owning side”这两个名称的原因,请参见本文中的答案,如果我们不定义owning side,GOTCHAs,会发生什么-
TypeB b = new TypeB();
this.typeBDao.save(b);

TypeA a = new TypeA();
a.setBs(ListUtils.createList(b));

System.out.println(a.getBs()); // output: [TypeB@25fe4d40]

this.typeADao.save(a);

System.out.println(a.getBs()); // output: [TypeB@25fe4d40]

this.typeADao.refresh(a);

System.out.println(a.getBs()); // output: []

this.typeBDao.refresh(b);
System.out.println(b.getA()); // output: null
TypeB b = new TypeB();

TypeA a = new TypeA();
a.setBs(ListUtils.createList(b));
b.setA(a);   

this.typeBDao.save(b);
this.typeADao.save(a);