0

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

  1. 单表- 所有类(子类和超类)都映射在一个表中,该表具有所有类的所有字段作为列;并且仅特定于某些子类的字段在其他相应条目中为 NULL。

.

@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)映射。

.

@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
}

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

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

4

1 回答 1

1

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

但是,您的选择确实包括您没有提到的另一种可能性,即InheritanceType.TABLE_PER_CLASS. 如果您使用它,您将拥有 N 个表(用于 N 个子类)而不是一个或 N+1。它在某些情况下效果很好,请参阅链接中的优点/缺点。

于 2013-03-21T15:10:33.943 回答