我有一个实体层次结构,我想在两个不同的模式中重用。
[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。我的问题是如何在保留层次结构的同时做同样的事情。这有帮助吗?
答案 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。您可以使用它来查询。