Hibernate,@ ManyToOne / @OneToMany,添加的孩子没有父母提取

时间:2016-08-05 15:22:59

标签: java hibernate

我或多或少有像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被填充时,所以我怀疑它可能是会话和存储在那里的对象的问题。

1 个答案:

答案 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 );
  }
}