2012-08-30 120 views
4

兩天前我遇到了懶惰關聯的問題,但仍未找到這種行爲的解釋。 這裏是我的簡單的類層次結構: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中都找不到線索。 有人可以解釋這一點嗎?

感謝您的幫助!

回答

0

固定。我的問題是不正確的。抱歉。 我的entitiy課程的獲得者和制定者有最後修改者。它打破了多對一的單一價值關聯。 假設我錯過了休眠日誌中的一些警告...... 我認爲在這種情況下通過休眠引發異常會更好。

1

如果您想了解延遲加載,請參閱此answer;它定義得非常好。