企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 9.1.6\. Table per concrete class, using implicit polymorphism 另一种可供选择的方法是采用隐式多态: ``` <class name="CreditCardPayment" table="CREDIT_PAYMENT"> <id name="id" type="long" column="CREDIT_PAYMENT_ID"> <generator class="native"/> </id> <property name="amount" column="CREDIT_AMOUNT"/> ... </class> <class name="CashPayment" table="CASH_PAYMENT"> <id name="id" type="long" column="CASH_PAYMENT_ID"> <generator class="native"/> </id> <property name="amount" column="CASH_AMOUNT"/> ... </class> <class name="ChequePayment" table="CHEQUE_PAYMENT"> <id name="id" type="long" column="CHEQUE_PAYMENT_ID"> <generator class="native"/> </id> <property name="amount" column="CHEQUE_AMOUNT"/> ... </class> ``` 注意,我们没有在任何地方明确的提及接口`Payment`。同时注意 `Payment`的属性在每个子类中都进行了映射。如果你想避免重复, 可以考虑使用XML实体(例如:位于`DOCTYPE`声明内的 `[ &lt;!ENTITY allproperties SYSTEM "allproperties.xml"&gt; ]` 和映射中的`&allproperties;`)。 这种方法的缺陷在于,在Hibernate执行多态查询时(polymorphic queries)无法生成带 `UNION`的SQL语句。 对于这种映射策略而言,通常用`&lt;any&gt;`来实现到 `Payment`的多态关联映射。 ``` <any name="payment" meta-type="string" id-type="long"> <meta-value value="CREDIT" class="CreditCardPayment"/> <meta-value value="CASH" class="CashPayment"/> <meta-value value="CHEQUE" class="ChequePayment"/> <column name="PAYMENT_CLASS"/> <column name="PAYMENT_ID"/> </any> ```