【问题标题】:Changing the inheritance strategy in branches of the class hierarchy via JPA annotations通过 JPA 注释更改类层次结构分支中的继承策略
【发布时间】:2010-12-21 23:49:15
【问题描述】:

今天我遇到了一个有趣的问题。我一直在使用 Hibernate JPA 进行继承层次结构,使用 SINGLE_TABLE 策略。后来,我在层次结构中添加了一个超类,它定义了TABLE_PER_CLASS 策略。结果是整个层次结构都盯着TABLE_PER_CLASS。当然,如果我们阅读@Inheriatance javadoc:

,这似乎是公平的
定义用于实体类层次结构的继承策略。它在作为实体类层次结构根的实体类上指定。

Hibernate docs 但是,说:

可以对同一继承层次的不同分支使用不同的映射策略

并继续本声明的豁免。这是通过 XML 配置完成的。

所以,最后,我的问题是 - 有没有办法(也许是休眠属性)通过注释启用上述 xml 行为,并使用 EntityManager

【问题讨论】:

  • 我不这么认为,我认为这是对 JPA 规范的 Hibernate 扩展。
  • 这是肯定的。我很好奇是否没有一些特定于休眠的属性来启用该行为。

标签: java hibernate jpa


【解决方案1】:

好吧,如果您阅读 Hibernate 文档a little further 的“继承”一章 :-) 您会看到给出的混合表层级和表子类策略的示例实际上只不过是table-per-hierarchy,带有辅助表:

<class name="Payment" table="PAYMENT">
    <id name="id" type="long" column="PAYMENT_ID">
        <generator class="native"/>
    </id>
    <discriminator column="PAYMENT_TYPE" type="string"/>
    <property name="amount" column="AMOUNT"/>
    ...
    <subclass name="CreditCardPayment" discriminator-value="CREDIT">
        <join table="CREDIT_PAYMENT">
            <property name="creditCardType" column="CCTYPE"/>
            ...
        </join>
    </subclass>
    <subclass name="CashPayment" discriminator-value="CASH">
        ...
    </subclass>
</class>

您也可以使用@SecondaryTable annotation

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="PAYMENT_TYPE")
@DiscriminatorValue("PAYMENT")
public class Payment { ... }

@Entity
@DiscriminatorValue("CREDIT")
@SecondaryTable(name="CREDIT_PAYMENT", pkJoinColumns={
    @PrimaryKeyJoinColumn(name="payment_id", referencedColumnName="id")
)
public class CreditCardPayment extends Payment { ... }

@Entity
@DiscriminatorValue("CASH")
public class CashPayment extends Payment { ... }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
相关资源
最近更新 更多