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

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

@Entity public class TypeA extends AbstractModel { @Id @GeneratedValue private int id; @OneToMany(mappedBy="a") private Collection bs; // Getters & Setters ... } 

 @Entity public class TypeB extends AbstractModel { private static final long serialVersionUID = -3526384868922938604L; @Id @GeneratedValue private int id; @ManyToOne() @JoinColumn(name="a_id") private TypeA a; } 

当我设置属性TypeA.bs时,这不会影响映射,尽管它应该。 请参阅以下示例:

 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 

如果映射是双向的,则应该填充集合并且应该更新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() ,因为关联仅由拥有方管理。