我有 A、B 和 C 类。A 对 B(多单)有一个属性,B 对 C(单单)有一个属性。这些类如下所示(相关属性的缩写):
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 和 Bs 的顺序,B 中的 Cs 集合不再起作用:
// 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());
}
我已经完成了以下调试:
- 在第二个代码中休眠触发没有选择语句来加载 Cs
- 在第一个代码中,返回的 B 属于 B 类型,而 C 的集合具有 org.hibernate.collection.PersistentSet 类型
- 在第二个代码中,返回的 B 的类型为 B_$$_javassist_58,而 C 的集合的类型为 java.util.HashSet
我正在使用休眠 3.8.3。