现在,据我所知,JPA中有两种最常用的继承映射策略:
@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 { //... }
@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中是否可行并且有意义吗?
编辑:我不知道代码格式有什么问题......
答案 0 :(得分:1)
不,这在JPA中是不可能的。您需要在基类级别配置@Inheritance
,并且不能在子类级别覆盖它。
然而,你的选择还包括一个你未提及的可能性,即InheritanceType.TABLE_PER_CLASS
。如果你使用它,你将有N个表(对于N个子类)而不是一个或N + 1。它适用于某些情况,请参阅链接中的优点/缺点。