Java Hibernate惰性获取不初始化实例
两天前,我遇到了一个关于懒惰联想的问题,至今还没有找到这种行为的解释。 以下是我的简化类层次结构:Java Hibernate惰性获取不初始化实例,java,hibernate,lazy-loading,fetch,Java,Hibernate,Lazy Loading,Fetch,两天前,我遇到了一个关于懒惰联想的问题,至今还没有找到这种行为的解释。 以下是我的简化类层次结构: @Entity @Table(name="A") public class A { @Id @GeneratedValue @Column(name="ID") private int id; @OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade=CascadeType.ALL) privat
@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;
}
正如您所看到的,C的实例没有正确初始化。
在类B中将fetch类型从LAZY更改为渴望字段c之后,一切都正常
我怀疑有一些CGLIB魔法,但在规范和谷歌中都找不到任何线索。
有人能解释一下吗
谢谢你的帮助 如果您想了解延迟加载,请参见此;它定义得很好。已修复。我的问题不对。很抱歉 我的实体类的getter和setter有最后一个修饰符。它打破了单值关联,就像多对一。 假设我错过了hibernate日志中的一些警告。。。 我认为对于这种情况,最好通过hibernate抛出一个异常
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 !!!
}