Java 在JPA中同时使用两种策略的ORM映射继承?
现在,据我所知,JPA中有两种最常用的继承映射策略: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
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
}