2011-08-09 36 views
0

我有一個實體層次結構,我想在兩個不同的模式中重用。在兩個模式中重用JPA實體層次結構

[Parent1]   [Parent2] 
     \1   1/ 
      \   /
      \0..* 0..*/ 
     [ChildSuperclass]    -- @Inheritance(SINGLE_TABLE) 
       ^
       /_\ 
     _________|_________ 
     |     | 
[ChildSubclass1] [ChildSubclass2] 

我想有四個表:

  • PARENT1
  • CHILD1
  • PARENT2
  • CHILD2

其中CHILD1和CHIL D2被映射爲可以共享類層次和實現。理想情況下,PARENT1/CHILD1和PARENT2/CHILD2將處於單獨的模式中,但我必須使用單個持久單元。

我需要一個與超類的關係,所以它看起來像@MappedSuperclass不是一個選項。 (但是,家長1沒有而不是需要參考家長2的孩子,反之亦然。)

這可能嗎?

看起來像這樣:https://forum.hibernate.org/viewtopic.php?p=2419646 但我不得不使用JPA註釋。 Hibernate特定的註釋是一個選項,但XML不是。

如果我想爲每個模式創建不同的子類,我也無法看到多重繼承的方法。用接口分離類層次結構是我的最後手段。

更新希望我可以澄清一個更具體的例子。

[RedPerson]  [BluePerson] 
     \1   1/ 
      \   /
      \0..* 0..*/ 
      [Automobile]    -- @Inheritance(SINGLE_TABLE) 
       ^
       /_\ 
     _________|_________ 
     |     | 
    [Sedan] [PickupTruck] 

由於商業原因,紅人和藍人需要有完全獨立的表格和數據。如果只有一種類型的汽車,那麼我可以將其製作成映射超類,並擁有PinkAuto和BlueAuto。我的問題是如何在保留層次結構的同時做到這一點。這有幫助嗎?

+0

這有點令人困惑。你爲什麼在這裏需要'ChildSuperClass'? – Jeremy

+0

我希望每個家長使用鑑別器列引用幾個可能的子類型中的任何一個。 (你如何代表沒有超類的類層次結構?) –

+0

啊,對不起。我錯讀了你的圖表。 – Jeremy

回答

0

您必須使用@DiscriminatorColumn註釋。

@Entity 
@Inheritance(strategy=SINGLE_TABLE) 
@DiscriminatorColumn(name="childtype", discriminatorType=INTEGER) 
public class ChildSuper{} 

@Entity 
@DiscriminatorValue("child1") 
public class Child1{} 

@Entity 
@DiscriminatorValue("child2") 
public class Child2{} 

然後,Parent1可以映射到Child1和Parent2並映射到Child2。但您仍然將ChildSuper作爲參考類型和通用代碼垃圾箱。你可以用它來查詢。

+0

無論何時使用@Inheritance(strategy = SINGLE_TABLE)',JPA默認爲'@DiscriminatorColumn(name =「DTYPE」,discriminatorType = STRING)'和'@ DiscriminatorValue'默認爲SQL實體名稱。因此添加它們並不會改變任何事情。它也不會幫助將層次結構映射到兩個不同的表/模式。 –

+0

然後我仍然誤解你在找什麼。如果你想要ChildSuper類,爲什麼它必須被映射爲一個實體?您可以讓Parent1關心Child1,Parent2關心Child2。然後讓每個孩子擴展你的ChildSuper,但是讓它遠離JPA。無論如何,關係1和關係2似乎是相互排斥的。 – Jeremy

+0

非常感謝您看我的問題。我希望我澄清這個例子。 –