2011-05-10 259 views
0

我有一個類居民和ResidentInfo 之間的關係一對多ResidentInfo不應該無居民須存在,但ResidentInfo不需要JPA(休眠)一對多的關係,空

這裏是我的課:

public class Resident { 
... 
    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, mappedBy = "resident") 
    @Cascade({org.hibernate.annotations.CascadeType.ALL}) 
    public List<ResidentInfo> infos; 
} 

public class ResidentInfo { 
... 
    @ManyToOne(optional = false) 
    public Resident resident; 
    public String label; 
    public String value; 
} 

我是JPA新手,也許我做錯了。

問題是,當我嘗試一次插入所有數據(同時創建居民及其信息),我有一個空例外。

這是因爲ResidentInfo.resident.id爲空(但由於居民在同一時間創建我不能指定值!)

而且即使是首次創建的居民,我有這樣的錯誤但我不知道爲什麼:

detached entity passed to persist: models.ResidentInfo 

那麼如何解決這些問題呢?

回答

2

要解決您的問題,您應該首先提供ResidentInfo類中的setter方法來設置info實例所屬的Resident對象。它可能看起來像這樣

public void setResident(Resident resident) { 
    this.resident = resident; 
} 

此外,ResidentInfo對象只能在Resident類中完成。您應該提供一種方法將新的ResidentInfo對象添加到包含的列表中。添加ResidentInfo對象的一部分是設置與其關聯的Resident對象。該代碼可能是這個樣子

public void addResidentInfo(ResidentInfo residentInfo) { 
    residentInfo.setResident(this); 
    infos.add(residentInfo); 
} 

有了這些行列表中的每個對象包含到與它相關的居民實例的引用。所以當你堅持所有的對象時,必要的引用(以及任何必需的ID)都被設置。

在旁註中,您應該在JPA註釋中檢查Cascade信息。你提供了兩個不同含義的不同註釋。

+0

嗨,我壓制了「cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH}」是否正確? 另外我已經測試了你的代碼,這隻適用於部分工作,當我想將新的ResidentInfo添加到現有的居民這不起作用 – Bouki 2011-05-10 10:59:14

+0

你是什麼意思,它不起作用?使用指定的方法添加新的ResidentInfo時,結果如何? – Osiris76 2011-05-10 11:17:54

+0

我沒有錯誤,但沒有插入所有ResidentInfos記錄 – Bouki 2011-05-10 11:20:29