2

我有 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。

4

1 回答 1

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();
于 2013-05-21T10:26:13.630 回答