整个类层次结构可以被映射到单张表。这张表把所有类的所有属性的列都包括在层次结构中。由特定行表示的具体子类通过一个类型辨别标志列的值进行识别。这个映射策略在性能和简单性方面都胜出一筹。它是表示多态的最佳方法---多态和非多态的查询都执行得很好---并且更易于手工实现。不用复杂的联结或者联合也有可能生成特殊的报表。有一个重大的问题:子类声明的属性的列必须声明为可为空。
pom.xml:
hibernate.cfg.xml:
父类, pojo/BillingDetails .java:
子类,pojo/BankAccount.java:
子类,pojo/CreditCard.java:
映射文件,pojo/BillingDetails.hbm.xml , 重点都在这个映射文件上,请注意些。
util/HibernateUtil.java:
util/Manager.java:
输出的sql:
大家可以注意下打印出来的查询的sql语句。
上例中,继承层次结构的根类BillingDetails被映射到表:BILLING_DETAILS.
必须添加一个特殊的列以便在持久化类之间进行区分:辨别标志(discriminator)。这不是持久化类的属性,由hibernate内部使用。列名为BILLING_DETAILS_TYPE,值为字符串---在这个例子中,为"CC"或者"BA"。hibernate自动设置和获取辨别标志的值。
关于超类的属性,用简单的<property>元素映射.
每个子类都有自己的<subclass>元素。子类的属性被映射到BILLING_DETAILS表中的列。记住不允许NOT NULL约束,因为BankAccount实例不会有expMonth属性,且该行的CC_EXP_MONTH字段必须为NULL.
<subclass>元素可以依次包含其它被嵌套的<subclass>元素,直到整个层次结构被映射到表中。
请注意,这里只有一个表:BILLING_DETAILS ,包含了所有属性或字段。
BILLING_DETAILS表:
BILLING_DETAILS_ID
BILLING_DETAILS_TYPE
OWNER
CC_NUMBER
CC_EXP_MONTH
CC_EXP_YEAR
BA_ACCOUNT
BA_BANKNAME
BA_SWIFT
本文介绍了Hibernate如何将类层次结构映射到单一表中,利用辨别标志列区分不同子类。示例展示了BankAccount和CreditCard两个子类如何共用BillingDetails表,并通过discriminator值进行区分。在映射文件中,每个子类的属性被映射到同一表的不同列,允许子类属性为NULL以适应不同类的需求。

1392

被折叠的 条评论
为什么被折叠?



