在两个模式中重用JPA实体层次结构

时间:2011-08-09 20:00:33

标签: java hibernate jpa

我有一个实体层次结构,我想在两个不同的模式中重用。

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

我想要四张桌子:

  • PARENT1
  • CHILD1
  • PARENT2
  • CHILD2

其中CHILD1和CHILD2被映射,以便可以共享类层次结构和实现。理想情况下,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]

出于商业原因,Red people和Blue people需要拥有完全独立的表和数据。如果只有一种类型的汽车,那么我可以让它成为一个映射的超类并拥有PinkAuto和BlueAuto。我的问题是如何在保留层次结构的同时做同样的事情。这有帮助吗?

1 个答案:

答案 0 :(得分: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放在中间作为引用类型和公共代码bin。您可以使用它来查询。