0

我有这个hbm:

<class name="Payment" table="PAYMENT">
<id name="id" type="long" column="PAYMENT_ID">
    <generator class="native"/>
</id>

<property name="amount" column="AMOUNT"/>
...
<subclass name="CreditCardPayment" >
    <join table="CREDIT_PAYMENT">
        <property name="creditCardType" column="CCTYPE"/>
        ...
    </join>
</subclass>

我不想使用标签 <discriminator> 我想要两张具体的桌子,一张用于“付款”,一张用于“信用卡付款”,HBM 是否满足我的需求?

4

1 回答 1

2

如果你要使用<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>
于 2013-07-30T11:18:27.553 回答