短版的草率做法:最適合在JPA連接不同的實體類型
有各種表格/在我的域模型實體具有相同字段(UUID)。有一個表格,我需要將這些實體的行/實例鏈接到其他JPA管理的實體。換句話說,該鏈接表中字段的實例將不會被預先知道。我能想到的兩種方法是:
- 使用一個抽象的實體和TABLE_PER_CLASS策略,或
- 使用鏈接表的實例的
@MappedSuperClass
存儲類的名稱爲好,或者類似的東西,讓我定義了從右表獲取實際實例的邏輯。
兩者在複雜性和性能方面都有優點和缺點。你認爲哪一個最好,是否有第三種選擇,或者你過去是否嘗試過這樣的事情,並會提出建議/強烈警告?萬一
龍版您想了解更多的背景:
我有一個數據庫/對象模型,其中很多類型都有一個共同的領域:一個通用唯一標識符(UUID)。原因是這些類型的實例可能會發生變化。這些更改遵循命令模型,它們的數據可以被封裝並且自身持續存在。我們稱這種變化爲「突變」。必須能夠找出數據庫中對於任何給定實體存在哪些突變,反之亦然,存儲的突變在哪個實體上操作。
要存儲「突變」,我們用一個表/實體,稱爲MutationHolder
。要將突變連接到其目標實體,有一個MutationEntityLink
。這個數據是不是直接在MutationHolder
的唯一原因是因爲可以有直接或間接的聯繫,但在這裏,這並不重要,所以我離開了出來:
問題歸結到我怎麼能建模entity
字段MutationEntityLink
。我可以想到兩種方法。
第一個是使用UUID字段對註釋類進行抽象@Entity
。 Customer
,Contract
和Address
將擴展它。所以這是一個TABLE_PER_CLASS策略。我假設我可以將此作爲entity
字段的類型,儘管我不確定。但是,我擔心這可能會導致嚴重的性能損失,因爲JPA需要查詢很多表以查找實際實例。
第二種方法是簡單地使用@MappedSuperClass
並只存儲實體的UUID entity
字段MutationEntityLink
。爲了得到具有該UUID的實際實體,我必須以編程方式解決它。添加一個額外的列,其中包含實體的類名,或者其他可以讓我識別它或將其粘貼到JPQL查詢中的列。這需要更多的工作,但似乎更有效率。我不反對編寫一些實用工具類,或者根據需要做一些反射/自定義註釋工作。
我的問題是哪種方法最好?或者,你可能有更好的建議,或注意我錯過了一些東西;例如,可能有添加類型列的方法,即使使用TABLE_PER_CLASS繼承將JPA指向右表?也許你已經嘗試過這樣的事情,並想警告我會發生很多問題。
一些額外的信息:
- 我們創建數據庫模式,所以我們可以添加任何我們想要的。
- 單表繼承策略不是一個選項。表格必須保持不同。出於同樣的原因,加入繼承似乎也不適合。
- JPA提供程序是Hibernate,使用不屬於JPA標準的東西不是問題。
很高興聽到您實際使用該方法。這表明它是可行的。我認爲爲每個映射實體劃分MutationEntityLink會非常不方便,所以現在一種鑑別器列聽起來最好。 –
@G_H是的,這是決定反對子類的原因。 – Thomas
我喜歡@Thomas爲每個實體分派MutationEntityLink的想法。由於它是一個技術類,它提供了突變與實體之間的聯繫,所以我會選擇單表繼承。該表將具有其鑑別器列和每個實體的一個外鍵列。該表可能不是您的域模型最優雅的表示,但您可以從中獲得良好的性能。 –