3.6.2 每张表一个类层次
来源:互联网 发布:手机视频合成软件 编辑:程序博客网 时间:2024/05/22 05:04
另外一种做法就是一张表映射到整个类层次上面。这张表的列和类层次中的所有属性相对应。具体的子类代表的行有discrimator列来决定。具体可以参看3.8。
在性能和简易性上这种映射策略都是值得考虑的。同时它也是表示多态的最好方法,不论是多态查询还是非多态查询都能工作的很好,而且容易实现。它可以尽可能的不使用连接和联合,schema的改变也变得更加的直观。
有一个主要的问题:表示属性的列必须是可以为null的。如果子类定义了几个非null的属性,那么从数据完整性的角度来考虑的话,NOT NULL约束的丢失会成为一个严重的问题。
在hibernate中,我们使用<subclass>属性来指定表与类层次之间的映射关系。具体可以参见列表3.8。
(1)在类层次结构中的基类BusinessDetails被映射到表BUSINESS_DETAILS。
(2)我们需要一个特殊的列来区分持久类:discriminator。这并不是一个持久类的属性;它只是在Hibrenate内部来使用。列名是BILLING_DETAIL_TYPE,至于值的设定,在本例中为'CC'或者'BA'。Hibernate会自动设置和取回discriminator的值。
(3)基类的属性仍然用<property>属性来映射。
(4)每个子类都有属于自身的<subclass>元素。子类的属性被映射到BILLING_DETAILS表。请记住非NULL的值是不允许的,因为CreditCard实例不能拥有一个null的bankSwift属性。
<subclass>可以包含其他<subclass>元素,知道整个类层次被映射到表格。一个<subclass>元素不能包含<joined-subclass>元素。在这一点上,映射策略是无法被改变的。
Hibernate将会使用如下的SQL语句来查询BillingDetails类:
select BILLING_DETAILS_ID, BILLING_DETAILS_TYPE,OWNER,.....CREDIT_CARD_TYPE, from BILLING_DETAILS where CREATED=?
为了查询CreditCard子类,Hibernate将会使用在discriminator使用查询条件:
select BILLING_DETAILS_ID, CREDIT_CARD_TYPE, CREDIT_CARD_EXP_MONTH, … from BILLING_DETAILS where BILLING_DETAILS_TYPE='CC' and CREDTED=?
- 3.6.2 每张表一个类层次
- 3.6.3 每张表一个子类
- 创建一个目录列表进行每张sheet表的链接
- 给每张表添加字段
- Android对数据库表的一个约定:每张表都应该至少有_id这列
- 利用 JSP 中的反射机制封装一个 Servlet ,就不用每张表的每个方法都写一个 Servlet
- 将整个继承树映射到一张表&将每个类映射到每张表
- 获取每张表的记录数
- Oracle查询每张表的记录数
- mssql查每张表的记录数
- 获取数据库所有表 和 每张表信息
- 表结构设计-每张表都需要有外键和type
- SQL查询数据库中每张表的记录数!
- SQL查询数据库中每张表的记录数
- 统计数据库中每张表的记录数统计
- 快速查看数据库每张表的大小(存储过程)
- oracle查询用户下每张表的信息
- Excel 每张表保存为独立的工作簿
- 开始正式学习php
- 用CFileFind类实现的目录树遍历
- Java高级编程-网络编程详解 (3)
- ASP.Net 2.0 发送邮件的代码
- VS2008 中 运使用程序正常初始化(0xc000007b)失败
- 3.6.2 每张表一个类层次
- 搜狗云输入法 使用心得
- Seinfeld
- No.9
- Java高级编程-网络编程详解 (4)
- poj 1015 Jury Compromise 动态规划
- Web Browser控件的属性与事件
- aix用命令查监听端口对应的进程
- DriverManager.getConnection(url_String, user_String, password_String)活动图