私はクラスA、B、およびCを持っています。AにはB(manytoone)に対するプロパティがあり、BにはC(onetomany)に対するプロパティがあります。クラスは次のようになります (関連するプロパティへの短縮)。
class A {
[...]
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fkb", nullable = false)
private B b;
[...]
}
class B {
[...]
@OneToMany(mappedBy = "b")
@Cascade(value = { CascadeType.ALL })
private Set<C> cs;
public Set<C> getCs() {
return cs;
}
[...]
}
class C {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fkb", nullable = false)
private B b;
}
問題は、As と B をロードする順序によっては、B の C のコレクションが機能しなくなったことです。
// outputs correct count of Cs per B
List<B> bs = session.createCriteria(B.class).list();
for (B b : bs) {
System.out.println(b.getCs().size());
}
// outputs always 0
List<A> as = session.createCriteria(A.class).list();
List<B> bs = session.createCriteria(B.class).list();
for (B b : bs) {
System.out.println(b.getCs().size());
}
次のデバッグはすでに行っています:
- 2 番目のコードでは、hibernate は Cs をロードする select ステートメントをトリガーしません
- 最初のコードでは、返される B は B 型で、C のセットは org.hibernate.collection.PersistentSet 型です。
- 2 番目のコードでは、返された B の型は B_$$_javassist_58 であり、C のセットの型は java.util.HashSet です。
休止状態 3.8.3 を使用しています。