我或多或少有像hibernate和h2 / postgres这样的设置(两者都无法正常工作)
@Entity
class A {
@Id
@GeneratedValue
long id;
@OneToMany(mappedBy = "a", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
List<B> bs;
}
@Entity
class B {
@Id
@GeneratedValue
long id;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
A a;
}
现在,有@Transactional存储库和save / update / getAll / getById方法。
我的问题是当我这样做时:
A a = new A();
save(a);
B b = new B();
b.a = a;
save(b);
A anotherA = getById(a.id);
对象叫&#34;另一个&#34; &#34; bs&#34;中没有任何B对象领域。
我应该做些什么来实现它,或者我的方法有问题吗?
另外,当我在一段时间之后调用最后一行bs被填充时,所以我怀疑它可能是会话和存储在那里的对象的问题。
答案 0 :(得分:1)
您必须确保在关系的两边应用关系,如下所示:
A a = new A();
session.save( a );
B b = new B();
b.setA( a );
a.getBList().add( b );
session.save( b );
通常为了避免将这种类型的代码放在我应用程序的不同位置,我通常会公开一个为我管理这种关系的actor方法。
// a method inside B
public void applyA(A a) {
// if B is currently related to A, break the relation
if ( this.a != null ) {
this.a.getBList().remove( this );
}
// apply the relation to both sides
this.a = a;
if ( a != null ) {
a.getBList().add( this );
}
}
同样,您可以向A
添加类似的方法public void applyB(B b) {
if ( b != null && !this.bList.contains( b ) ) {
b.apply( this );
}
}