gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:03:39 25 4
gpt4 key购买 nike

我有 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 和 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 没有触发 select 语句来加载 Cs
  • 在第一段代码中,返回的 B 是 B 类型,C 的集合是 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();

关于java - 如果之前作为关系加载了 bean,则不会加载集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16131704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com