2011-08-09 40 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

非常感谢您看我的问题。我希望我澄清这个例子。 –