3.6.1

假设我们首先采用最简单的方法:每一张表对应一个类。类当中的所有属性,包括继承的属性,都会映射到表中的列。

这种方法的最大问题就是它不能很好的支持多台的关联。在数据库中,关联通常表现为外键关系。在图3.7中,如果所有的子类被表现为外键关系,那么它们的父类的多台关联并不能被简单的表示成为关联关系。但是这可能会为业务模型带来一些问题,因为父类BillingDetails和User存在关联,那么其子类对应的表都需要外键关联到USER表。

在多态查询的方面也存在问题。当需要查询父类的时候,你可能需要多个查询语句才能完成。虽然可以通过union查询来完成,但是union查询使用起来并不是很方便,而且Hibernate并不支持union的书写方式。因此当你查询BillingDetails的时候,你需要下面两条SQL语句来完成:

select ….. from CREDIT_CARD where CREATED=?

select ….. from BANK_ACCOUNT where CREATED=?

也就是说,有多少个子类就有多少个查询。

这样做存在另外一个理论上的问题,就是多个表的列可能具有相同的语义,这带来schema上的复杂性。例如,当需要修改父类的一个属性的时候,将会影响到多个子类对应的列。这也会在实现子类的时候带来数据库完整性约束的麻烦。

这种映射策略并不需要Hibernate中做特别的配置,你只要为每个类创建<class>标签即可。在这里我们建议在类体系的顶层使用这样的映射策略,因为它们并没有多态的特性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值