ORM在JPA中同时使用两种策略映射继承?

时间:2013-03-21 14:59:41

标签: java hibernate inheritance jpa orm

现在,据我所知,JPA中有两种最常用的继承映射策略:

  1. 单个表 - 其中所有类(子类和超类)都映射到一个表中,该表中包含来自所有类的所有字段作为列;并且仅特定于某些子类的字段在其他相应的条目中为NULL。
  2. @Entity
    @Table(name="types")
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name="types", discriminatorType=DiscriminatorType.STRING, length=1)
    public abstract class Base { //... }
    
    @Entity
    @DiscriminatorValue(value="A")
    public class TypeA extends Base { //... }
    
    @Entity
    @DiscriminatorValue(value="B")
    public class TypeB extends Base { //... }
    
    1. 已加入的表策略 - 其中有一个基类表,其中列为所有基类'字段,另一列为类型;还有每个子类的特定表,每个子类只有相应的子类'字段,这些字段与基表一对一映射(通过PK)。
    2. @Entity
      @Table(name="USERS")
      @Inheritance(strategy=InheritanceType.JOINED)
      @DiscriminatorColumn(name="types",discriminatorType=STRING, length=1)
      public abstract class Base { //... }
      
      @Entity
      @Table(name="SELLERS")
      @DiscriminatorValue(value="A")
      @PrimaryKeyJoinColumn(name="base_id")
      public class TypeA extends User { //... }
      
      @Entity
      @Table(name="BIDDERS")
      @DiscriminatorValue(value="B")
      @PrimaryKeyJoinColumn(name="base_id")
      public class TypeB extends User { //... }
      

      在我的域名中,我有这些课程:

      public abstract class Base {
      //data
      }
      
      public class TypeA extends Base {
      //only one field
      }
      
      public class TypeB extends Base {
      // many more fields
      }
      

      我想要TypeA和Base之间的1.继承映射策略和TypeB和Base之间的继承映射策略(这是一个过度简化;实际上有很多实体)因为我不希望另一个表再一个领域。这在JPA中是否可行并且有意义吗?

      编辑:我不知道代码格式有什么问题......

1 个答案:

答案 0 :(得分:1)

不,这在JPA中是不可能的。您需要在基类级别配置@Inheritance,并且不能在子类级别覆盖它。

然而,你的选择还包括一个你未提及的可能性,即InheritanceType.TABLE_PER_CLASS。如果你使用它,你将有N个表(对于N个子类)而不是一个或N + 1。它适用于某些情况,请参阅链接中的优点/缺点。