2016-11-04 140 views
0

我有兩個實體:@OneToMany重複條目

@Entity 
@Table(name="tblrelease") 
public class Release implements Serializable {  

    ... 

    @OneToMany(mappedBy = "release") 
    public Set<ReleaseIssue> getIssues() { 
     return issues; 
    } 
} 

@Entity 
@Table(name="tblissue") 
public class ReleaseIssue implements Serializable { 

    ... 

    @ManyToOne() 
    @JoinColumn(name = "relId", nullable = false) 
    public Release getRelease() { 
     return release; 
    } 
} 

如果我使用這個設置我得到以下異常:org.hibernate.LazyInitializationException:無法初始化懶洋洋地收集作用:... 主要原因是jsp想要訪問發佈失敗的問題,因爲它想要在會話之外訪問代理。

如果我使用FetchType = EAGER,我在版本中有重複。由於發佈對象具有問題,集合包含一個發佈對象的很多重複項。

+2

不是一個答案,但是您的Set,一個設計爲不允許重複的集合類具有重複的事實表明問題存在問題 - 您的實體上沒有正確的hashCode()和equals()方法。讓您的IDE生成這些會使重複的問題消失,但您通常不希望EAGER加載oneToMany。但是,如果將'LazyInitializationException'粘貼到右上角的搜索框中,則會出現大量重複的問題。 – Gimby

+0

嗨Gimby,謝謝你的幫助。它工作正常。如果您將文本粘貼到答案中,我會將其標記爲正確的答案。 –

回答

0

在你的DAO類,你可以簡單地使用

for(ReleaseIssue issue : release.getIssues(){ 
    Hibernate.initialize(issue) 
} 

這將初始化設定解除的對象,當你在JSP中檢索它們。