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

时间:2013-04-21 13:37:23

标签: java hibernate persistence

我有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不会触发加载Cs
  • 的select语句
  • 在第一个代码中,返回的Bs是B类,而Cs集的类型是org.hibernate.collection.PersistentSet
  • 在第二个代码中,返回的Bs是B _ $$ _ javassist_58类型,而Cs的集合类型为java.util.HashSet

我使用的是Hibernate 3.8.3。

1 个答案:

答案 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();