假设我们首先采用最简单的方法:每一张表对应一个类。类当中的所有属性,包括继承的属性,都会映射到表中的列。
这种方法的最大问题就是它不能很好的支持多台的关联。在数据库中,关联通常表现为外键关系。在图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>标签即可。在这里我们建议在类体系的顶层使用这样的映射策略,因为它们并没有多态的特性。