Hibernate双向@ManyToOne,更新不拥有的一面不起作用

我有一个非常简单的设置,可以尝试使用注释进行双向映射:

@Entity

public class TypeA extends AbstractModel<TypeA> {

@Id

@GeneratedValue

private int id;

@OneToMany(mappedBy="a")

private Collection<TypeB> bs;

// Getters & Setters ...

}

@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,但不是。有任何想法吗?

感谢您的帮助,现在我明白了!

回答:

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

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双向@ManyToOne,更新不拥有的一面不起作用 的全部内容, 来源链接: utcz.com/qa/399502.html

回到顶部