2010-12-13 16 views
0

我有一個實體可以有0個或多個同一個實體的子代。另外,一個實體可以有同一個實體的0個或一個父代。JoinTable(Parent/Child)自我總是加入加載表

表結構

Account (
    AccountId PK, 
    Name char 
    etc... 
) 

AccountRef (
    ChildId PK, FK references Account(AccountId) 
    ParentId PK, FK references Account(AccountId) 
) 

一切正常之外的任何時間我加載一個賬戶,一個連接始終在連接表做(我假設,看看是否有一個AccountRef記錄) 。查詢不會回到Account實體上,所以當我執行account.getMasterAccount()時,會加入AccountRef,然後返回Account以獲取主帳戶。再次,這是完全正確的,但不是最優的,因爲連接在需要時被執行了兩次,在不需要時被執行一次。

是否只有這樣才能對LazyToOne使用檢測,還是有更好的方法來映射它?這是一個傳統的表結構,我無法修改它。

@Entity 
Account { 

@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="masterAccount") 
    private Set<Account> subAccount; 

@ManyToOne(fetch=FetchType.LAZY) 
@JoinTable(name="AccountRef", 
     joinColumns = @JoinColumn(name="childId", referencedColumnName="accountId"), 
     inverseJoinColumns = @JoinColumn(name="parentId", referencedColumnName="accountId") 
    ) 
    private Account masterAccount; 

回答

0

爲什麼你需要連接表?對於一對多,它不應該是必要的。你應該能夠完全放棄JoinTable註解?或者有沒有理由需要它?

+0

雙向關聯存儲在一個單獨的表AccountRef中,這就是我使用連接表的原因。有沒有更好的方法來映射這個? – 2010-12-13 17:54:02

+0

如果您沒有連接表,它將如何工作。無需連接表即可實現雙向映射。唯一一次你可能不想要它是如果關係不可交換。即如果A是B的父親並不意味着B是A的孩子。 – 2010-12-13 19:29:51

+0

那麼你是說刪除連接表併爲AccountRef創建一個單獨的實體並使用應用程序代碼保持同步? AccountRef是傳統應用程序所必需的。 – 2010-12-13 19:52:18