繁体   English   中英

如果bean作为关系之前已加载,则集合未加载

[英]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不触发任何select语句来加载Cs
  • 在第一个代码中,返回的B的类型为B,C的Set的类型为org.hibernate.collection.PersistentSet
  • 在第二个代码中,返回的B的类型为B _ $$ _ javassist_58,而C的集合的类型为java.util.HashSet。

我正在使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM