如果你要使用<subclass>
方法,那么你需要一个discriminator。发生这种情况是因为hibernate 允许将子类策略与该标签混合,因此您可以在单个表中拥有不同类型的实体,其中一些实体需要执行连接操作,而另一些实体的所有值都存储在该主表中。在这里,您有CreditCardPayment
需要加入的和其他更简单的付款类型:
<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>
<subclass name="ChequePayment" discriminator-value="CHEQUE">
...
</subclass>
</class>
但是,您可以指定<joined-subclass>
,这等效于您正在执行的操作,然后 hibernate 将进行连接并获取每个类的元素,而无需鉴别器。请记住,您不能 在同一个类中混合<subclass>
和元素。<joined-subclass>
在这里,您拥有不需要鉴别器的每个子类的表Payment
实现,它强制您为每个具体的类实现使用一个表,但您也可以管理该类的父实体。
<class name="Payment" table="PAYMENT">
<id name="id" type="long" column="PAYMENT_ID">
<generator class="native"/>
</id>
<property name="amount" column="AMOUNT"/>
...
<joined-subclass name="CreditCardPayment" table="CREDIT_PAYMENT">
<key column="PAYMENT_ID"/>
<property name="creditCardType" column="CCTYPE"/>
...
</joined-subclass>
<joined-subclass name="CashPayment" table="CASH_PAYMENT">
<key column="PAYMENT_ID"/>
...
</joined-subclass>
<joined-subclass name="ChequePayment" table="CHEQUE_PAYMENT">
<key column="PAYMENT_ID"/>
...
</joined-subclass>
</class>