【发布时间】:2023-03-13 09:01:01
【问题描述】:
两天前我遇到了懒惰关联的问题,但仍然没有找到这种行为的解释。 这是我简化的类层次结构:
@Entity
@Table(name="A")
public class A
{
@Id
@GeneratedValue
@Column(name="ID")
private int id;
@OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
private Set<B> listB = new HashSet<B>();
}
@Entity
@Table(name="B")
public class B
{
@Id
@GeneratedValue
@Column(name="ID")
private int id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="A_ID")
private A a;
@ManyToOne(fetch=FetchType.LAZY) // ERROR!
// @ManyToOne(fetch=FetchType.EAGER) // OK
@JoinColumn(name="C_ID")
private C c;
}
@Entity
@Table(name="C")
public class C {
@Id
@GeneratedValue
@Column(name="ID")
private int id;
}
当我尝试从 db: A->B->C 读取简单结构时,我得到以下结果:
System.out.println(a.getId()); // 1
for (B b : a.getListB()) {
System.out.println(b.getId()); // 1
C c = b.getC();
System.out.println(c.getId()); // 0 !!!
}
如您所见,C 的实例未正确初始化。 将 B 类中字段 c 的提取类型从 LAZY 更改为 EAGER 后,一切正常!
我怀疑有一些 CGLIB 魔法,但在规范和 Google 中都找不到线索。 有人可以解释一下吗?
感谢您的帮助!!!
【问题讨论】:
标签: java hibernate lazy-loading fetch