Hibernate映射类继承之每个类层次结构一张表(父子类共用一张表,一个映射文件)

本文介绍了Hibernate如何将类层次结构映射到单一表中,利用辨别标志列区分不同子类。示例展示了BankAccount和CreditCard两个子类如何共用BillingDetails表,并通过discriminator值进行区分。在映射文件中,每个子类的属性被映射到同一表的不同列,允许子类属性为NULL以适应不同类的需求。
整个类层次结构可以被映射到单张表。这张表把所有类的所有属性的列都包括在层次结构中。由特定行表示的具体子类通过一个类型辨别标志列的值进行识别。这个映射策略在性能和简单性方面都胜出一筹。它是表示多态的最佳方法---多态和非多态的查询都执行得很好---并且更易于手工实现。不用复杂的联结或者联合也有可能生成特殊的报表。有一个重大的问题:子类声明的属性的列必须声明为可为空。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值