2

JPA プロバイダー、Spring および Spring MVC として Hibernate 4.1.10.Final を使用しています。次の 2 つのエンティティがあります。

@Entity
@Table(name = "a")
public class A {
    @Id
    private String id;

    @OneToMany(mappedBy = "a", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<B> bs;
}

@Entity
@Table(name = "b")
public class B {
    @Id
    private String id;

    @ManyToOne
    @JoinColumn(name = "fk_a_id")
    private A a;
}

を取得する必要がありA、それbは s であるためfind(A.class,id)、EntityManager の を使用します。

A a1 = em.find(A.class, id);
a1.getBs().size();

結果は次のとおりです。s のサイズbはゼロです (つまり、関連付けられた B がないことを意味します)。しかし、データベースには多くの関連付けられた B があると確信しており、実際、コンソールで確認しながらデータベースからデータをロードできます。

クエリを使用する場合:

Query query = em.createQuery("SELECT a FROM A AS a WHERE a.id = ?1",A.class);
query.setParameter(1, id);
A a= (A) query.getSingleResult();
a.getBs().size(); // = 22

代わりにサイズ = 22 を取得します。

どうしたの?

4

1 に答える 1

0

mappedByでプロパティを使用したため@OneToMany、リレーションの所有者はAではなくBです。そのため、Aのインスタンスをロードすると、対応するBはロードされません。次のように注釈を変更してみてください。

クラスAの場合:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="fk_a_id")
private Set<B> bs;

クラスB:

@ManyToOne
@JoinColumn(name = "fk_a_id", insertable=false, updatable=false)
private A a;
于 2013-02-27T09:17:28.860 に答える