Изменение стратегии наследования в ветвях иерархии классов с помощью аннотаций JPA
Сегодня я столкнулся с интересной проблемой. У меня была иерархия наследования с Hibernate JPA, с SINGLE_TABLE
стратегия. Позже я добавил суперкласс в иерархию, которая определила TABLE_PER_CLASS
стратегия. В результате вся иерархия стала вести себя как TABLE_PER_CLASS
, Это, конечно, кажется справедливым, если мы прочитаем @Inheriatance
Javadoc:
Определяет стратегию наследования, которая будет использоваться для иерархии классов сущностей. Он указывается в классе сущностей, который является корнем иерархии классов сущностей.
Однако в документах по гибернации говорится, что:
Можно использовать разные стратегии отображения для разных ветвей одной и той же иерархии наследования.
И продолжает на освобождения от этого заявления. Это делается с помощью конфигурации XML.
Итак, наконец, мой вопрос - есть ли способ (возможно, свойство гибернации) для включения вышеупомянутого поведения XML с помощью аннотаций и использования EntityManager
,
1 ответ
Что ж, если вы прочитаете главу "Наследование" в документации по Hibernate чуть дальше:-), вы увидите, что пример, приведенный для смешивания стратегий таблица-на-иерархию и таблица-на-подкласс, на самом деле не более, чем таблица на -иерархия с добавленными вторичными таблицами:
<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 { ... }