2016-09-26 78 views
0
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 

在父類中允許將子實體視爲具有與父代相同的信息的表加上一些屬性。閱讀時這對我很好(http://viralpatel.net/blogs/hibernate-inheritance-table-per-concrete-class-annotation-xml-mapping/)。寫入父實體以及在JPA模式上使用TABLE_PER_CLASS繼承策略存儲子實體時的策略

但我想這樣的情況下,我存儲一個子實體(目前它只填充子表),父表得到更新以及插入的共享部分。

在任何給定的寫入操作中,是否可以配置,或者是否需要在事務中明確執行childRepo.save(child)parentRepo.save(child)

從TABLE_PER_CLASS和JOINED策略中混合使用。 JOINED將共享信息存儲在父級中,而額外的子級屬性;而TABLE_PER_CLASS將所有內容存儲在子節點中。我想要所有信息的子表,而父表同時獲取所有共享信息。

+0

什麼是'childRepo'? – chrylis

+0

什麼是「知識庫」?如果你的意思是一個Spring數據庫,那麼你需要在你的問題中包含一個主要組件。你永遠不必爲了將它傳遞給接受超類的方法而將子類轉換爲其超類。 – chrylis

+0

1.是的,對不起,Spring Data的JPA Repostory。 2.這就是爲什麼我討厭這個解決方法,我試圖找到一個更好的解決方案 – Whimusical

回答

0

有3種繼承策略:SINGLE_TABLE,JOINED和TABLE_PER_CLASS。 -TABLE_PER_CLASS:將每個實體映射到一個表 -SINGLE_TABLE:父實體和子對象將只被映射到一個表(在DB中,你只有一個表用於整個繼承層次結構)。 -JOINED:這是你需要的一個,共享屬性將會保存在父表中,並且子相關屬性將會保存在子表中

+0

這些是由JPA定義的策略,對於需要實現它的任何其他需要的行爲,您可以使用SINGLE_Table + parentRepo.save((Parent)child) – Elgayed

+0

JOINED缺少我需要的之一,它存儲了繼承的屬性兒童實體在子表上以及 – Whimusical

+1

我的意思是它與您的需求最接近,如果您想堅持JPA定義的策略,其他方面您需要添加一些植入來滿足您的需求。您提到的解決方案很好,您還可以使用DB觸發器或JPA偵聽器(創建子實體的偵聽器,它將在父實體中執行持久化) – Elgayed

0

添加到3個繼承策略中:SINGLE_TABLE,TABLE_PER_CLASS和JOINED 。 談到插入,table_per_class在同一個表上有不同的插入查詢,但有不同的鑑別器值。對於每個備用列,表格也會有空值,鑑別器已被設置。選擇也將分開。如果使用聯合子類,則使用聯合的單個選擇查詢。 在連接策略中,每個父表和子表都插入兩個插入。選擇是通過父表與子表完成左外部連接。

所以,如果你想使用table_per_class,你可以使用每個子類的聯合,分配生成器類和多態性值作爲隱式或聯合子類。