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;
雙向關聯存儲在一個單獨的表AccountRef中,這就是我使用連接表的原因。有沒有更好的方法來映射這個? – 2010-12-13 17:54:02
如果您沒有連接表,它將如何工作。無需連接表即可實現雙向映射。唯一一次你可能不想要它是如果關係不可交換。即如果A是B的父親並不意味着B是A的孩子。 – 2010-12-13 19:29:51
那麼你是說刪除連接表併爲AccountRef創建一個單獨的實體並使用應用程序代碼保持同步? AccountRef是傳統應用程序所必需的。 – 2010-12-13 19:52:18