兩天前我遇到了懶惰關聯的問題,但仍未找到這種行爲的解釋。 這裏是我的簡單的類層次結構:Hibernate LAZY 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)
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;
}
當我嘗試讀取從數據庫結構簡單:A-> B-> C I得到如下結果:
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中都找不到線索。 有人可以解釋這一點嗎?
感謝您的幫助!