Eri*_*rik 4 java hibernate jpa java-ee
我有一个非常简单的设置来尝试带注释的双向映射:
@Entity
public class TypeA extends AbstractModel<TypeA> {
@Id
@GeneratedValue
private int id;
@OneToMany(mappedBy="a")
private Collection<TypeB> bs;
// Getters & Setters ...
}
Run Code Online (Sandbox Code Playgroud)
和
@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;
}
Run Code Online (Sandbox Code Playgroud)
当我设置属性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
Run Code Online (Sandbox Code Playgroud)
如果映射是双向的,则应该填充集合并且应该更新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);
Run Code Online (Sandbox Code Playgroud)
当您的实体处于不一致状态时,JPA将始终根据JPA关系的拥有方的对象状态存储值.在这种情况下,TypeB拥有与TypeA的关系.因此,如果TypeB的对象没有对TypeA的引用,则JPA假定没有定义关系.
这是它应该工作的方式:拥有一方是拥有这种关系的一方,它负责在数据库中管理它.开发人员(即您的责任)有责任确保您的对象图始终保持一致:如果关系的一方被修改,那么另一方也应该被修改.
如果你不总是这样做,你必须至少确保修改关系的拥有方,因为Hibernate只关心拥有方..
| 归档时间: |
|
| 查看次数: |
5137 次 |
| 最近记录: |