【问题标题】:ORM Mapping inheritance with two strategies at once in JPA?在JPA中一次使用两种策略的ORM映射继承?
【发布时间】:2013-03-11 04:03:30
【问题描述】:

现在,据我所知,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 中是否可行,是否有意义?

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

【问题讨论】:

    标签: java hibernate inheritance jpa orm


    【解决方案1】:

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

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

    【讨论】:

    • 我知道买,无论从 OO 还是从关系的角度来看,我都觉得不好。
    • 好吧,我不一定会为您推荐TABLE_PER_CLASS,只是指出它是一种选择。数据库和编程语言之间的impedance mismatch 将强制进行一些权衡。 ORM 层简化了其中一些,但没有工具会涵盖所有特殊情况,而您的工具很特别:“我想要一个单独的表,除非它只有几列。”
    猜你喜欢
    • 1970-01-01
    • 2015-06-07
    • 2011-12-02
    • 2012-12-08
    • 2022-10-25
    • 2015-08-02
    • 1970-01-01
    • 2012-04-17
    • 2012-02-24
    相关资源
    最近更新 更多