我有一个非常简单的设置来尝试带有注释的双向映射:
@Entity
public class TypeA extends AbstractModel<TypeA> {
@Id
@GeneratedValue
private int id;
@OneToMany(mappedBy="a")
private Collection<TypeB> bs;
// Getters & Setters ...
}
and
@Entity
public class TypeB extends AbstractModel<TypeB> {
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,但事实并非如此。有任何想法吗?
Edit感谢各位的帮助,现在我明白了!
对于一致的域模型,您应该始终设置关系的两侧,如下所示:
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 会假定没有定义关系。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)