2013-08-02 59 views
0

在我的業務領域的兩個實體RequestAction是在一對一的關聯作爲下:enter image description here1 + N問題具有實體1-1協會

我堅持他們通過休眠。問題是,如果我將它們保存在兩張表中,我將不得不面對1 + n問題。如果我將它們保存在一個表中(通過從同一個超類繼承它們),hibernate使用鑑別器,以便它們在表的兩個不同行中結束,這意味着相同的1 + n問題。
是否有可能將這兩個實體的關聯實例保存在具有相同ID的表的同一行的不同列中?或者更好的想法來處理這種情況?

回答

0

不,不應該使用兩個實例來表示同一行,因爲當您去刪除其中一個實體時會發生什麼?爲什麼不僅僅使用一個實體而且一個可嵌入?假設沒有請求的情況下Action不能存在,它將是可嵌入的並存在於Request表中。

0

你有沒有考慮懶惰動作。這將避免獲取Action,直到你確實需要它。例如,
@OneToOne(取= FetchType.LAZY,可選= TRUE)

+0

是的,在某些情況下,它使生活更美好,但在諸如「讓所有請求沒有動作」等查詢失敗。由於我有很多這樣的實體對,所以我試圖找到最有效的方法 – WSK

0

我更喜歡一到一個解決方案,如果請求和行動都是實體。我使用標準查詢並指定加入模式來避免n + 1問題。

Criteria c = session.createCriteria(Request .class); 
c.setFetchMode("action", FetchMode.JOIN) 
return c.list(); 

然而,這是一個有點笨重,你有,如果開發許多即席查詢方法您請求的員工與多個實體

public interface RequestRepository { 
     List<Request> findWithAction(Criteria criteria); 

     List<Request> findWithAnotherEntity(Criteria criteria); 
} 

我用@Embeded如果行動僅僅是一個的ValueObject,因此它們可以被存儲在一個表中。