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

Java 在JPA中同时使用两种策略的ORM映射继承?,java,hibernate,inheritance,jpa,orm,Java,Hibernate,Inheritance,Jpa,Orm,现在,据我所知,JPA中有两种最常用的继承映射策略: 单表-其中所有类(子类和超类)都映射到一个表中,该表将所有类的所有字段作为列;并且仅特定于某些子类的字段在其他相应条目中为空 联接表策略-其中一个表用于基类,列为所有基类字段,另一列用于类型;此外,每个子类都有特定的表,每个表仅具有与基表一一对应(通过PK)的相应子类字段 在我的领域中,我有以下类别: public abstract class Base { //data } public class TypeA extends Bas

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

  • 单表-其中所有类(子类和超类)都映射到一个表中,该表将所有类的所有字段作为列;并且仅特定于某些子类的字段在其他相应条目中为空
  • 联接表策略-其中一个表用于基类,列为所有基类字段,另一列用于类型;此外,每个子类都有特定的表,每个表仅具有与基表一一对应(通过PK)的相应子类字段
  • 在我的领域中,我有以下类别:

    public abstract class Base {
    //data
    }
    
    public class TypeA extends Base {
    //only one field
    }
    
    public class TypeB extends Base {
    // many more fields
    }
    
    我想要一个1。TypeA与Base和2之间的继承映射策略。TypeB和Base之间的继承映射策略(这是一种过分简化的策略;实际上有许多实体),因为我不想为一个字段再添加一个表。这在JPA中可能吗?它有什么意义吗


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

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


    然而,你的选择确实包括一个你没有提到的可能性,那就是。如果您使用它,您将有N个表(用于N个子类),而不是一个或N+1。它在某些情况下运行良好,请参见链接中的优点/缺点。

    我知道,无论是从OO还是从关系的角度来看,我都没有发现它的好处。好吧,我不一定向您推荐
    TABLE\u PER\u CLASS
    ,只是指出它是一个选项。数据库和编程语言之间的差异将迫使进行一些权衡。ORM层简化了一些,但没有工具能够涵盖所有特殊情况,而您的工具是特殊的:“我想要一个单独的表,除非它只有几列。”
    @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
    }