我有A,B和C类.A有B属性(多个人),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和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());
}
我已完成以下调试:
我使用的是Hibernate 3.8.3。
答案 0 :(得分:0)
您可以尝试以下操作:
1)通过A:
访问您的B实例List<A> as = session.createCriteria(A.class).list();
for (A a : as) {
for(C c : a.getB().getCs()){
System.out.println(c);
}
}
2)使用此标准加载B:
List<B> bs = session.createCriteria(B.class).setFetchMode("cs", FetchMode.EAGER).list();
for (B b : bs) {
System.out.println(b.getCs().size());
}
编辑:您认为您的项目可能以不同的方式查询您的数据库吗?例如,您可以尝试这个(使用HQL):
List<B> bs = getSession().createQuery("Select b From B b").list();