[英]Collection not loaded if bean was loaded before as relation
我有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());
}
我已经完成以下调试:
我正在使用Hibernate 3.8.3。
您可以尝试以下操作:
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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.