在数据库设计中,会遇到继承关系的表的设计,一般来说有以下三种映射方法:(假设有HOURLY_EMPLOYEES和SALARIED_EMPLOYEES两个子类,父类EMPLOYEES)
1.把每个子具体类都映射一张表,即只有 HourlyEmployee.hbm.xml和 SalariedEmployee.hbm.xml两个配置文件。
好处:简单方便
坏处:不支持多态查询
例如,为了检索所有employee对象,必须分别检索所有的HourlyEmployee实例和 SalariedEmployee实例,然后把它们合并到同一个集合中。
2.只为根类EMPLOYEES创建一张表,将公共属性和子类特有属性全部引入,并且加一个类型字段EMPLOYEE_TYPE,用于区分Employee的具体类型。
好处:支持多态查询
检索所有employee对象时,如果EMPLOYEE_TYPE字段取值为"HE",就创建 HoulyEmployee实例,如果EMPLOYEE_TYPE字段取值为"SE",就创建SalariedEmployee实例。
坏处:配置文件相应变得复杂:如
Employee.hbm.xml
<hibernate-mapping >
<class name="mypack.Employee" table="EMPLOYEES">
<id name="id" type="long" column="ID">
<generator class="increment"/>
</id>
<discriminator column="EMPLOYEE_TYPE" type="string" />
<property name="name" type="string" column="NAME" />
<subclass name="mypack.HourlyEmployee" discriminator-value="HE" >
<property name="rate" column="RATE" type="double" />
</subclass>
<subclass name="mypack.SalariedEmployee" discriminator-value="SE" >
<property name="salary" column="SALARY" type="double" />
</subclass>
</class>
</hibernate-mapping>
另外,如果公共属性和特有属性比较多时,字段会变得很多,表显得臃肿。
3.为根类和子类都创建映射表,即需要创建EMPLOYEES、HOURLY_EMPLOYEES和SALARIED_EMPLOYEES表。EMPLOYEES表仅包含和Employee类的属性对应的字段(子类共有的属性),HOURLY_EMPLOYEES和SALARIED_EMPLOYEES表也仅包含其类中有的属性对应的字段(特有的属性),另外HOURLY_EMPLOYEES和SALARIED_EMPLOYEES表中都以EMPLOYEES表中的EMPLOYEE_ID字段(主键)作为主键 ,同时也作为外键。
好处:同样支持多态查询,
Employee.hbm.xml
<hibernate-mapping >
<class name="mypack.Employee" table="EMPLOYEES">
<id name="id" type="long" column="ID">
<generator class="increment"/>
</id>
<property name="name" type="string" column="NAME" />
<many-to-one
name="company"
column="COMPANY_ID"
class="mypack.Company"
/>
<joined-subclass name="mypack.HourlyEmployee" table="HOURLY_EMPLOYEES" >
<key column="EMPLOYEE_ID" />
<property name="rate" column="RATE" type="double" />
</joined-subclass>
<joined-subclass name="mypack.SalariedEmployee" table="SALARIED_EMPLOYEES" >
<key column="EMPLOYEE_ID" />
<property name="salary" column="SALARY" type="double" />
</joined-subclass>
</class>
</hibernate-mapping>
通过左外连接获得子类对象的所有属性,如果HE表的EMPLOYEE_ID字段不为null,就创建HoulyEmployee实例,如果SE表的EMPLOYEE_ID字段不为null,就创建SalariedEmployee实例。
当保存一个子类对象时,需要发出两条sql语句分别向子表和EMPLOYEES表中插入记录。(session的save()方法能判断实际引用的子类类型,从而插入记录到不同的子表)那么
总的来说,具体怎么设计,还是要看情况....
分享到:
相关推荐
用Hibernate映射继承关系
hibernate实现继承关系映射的方式有三种,这种方式是将每个类都映射成一张表。
那么,这种继承关系在hibernate是如何映射呢? 对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念。hibernate的集成映射可以理解为持久化类之间的继承关系。在上边的例子中,学生集成了人,可以认为...
Hibernate继承映射+C3P0代码
从多种情况介绍Hibernate的继承多态映射关系
hibernate继承关系映射和java反射机制的运用
Hibernate案例与专题-继承映射策略。详细介绍了Hibernate继承映射策略。
Hibernate继承关系映射.pdf 简单明了
NULL 博文链接:https://qinchaoyong.iteye.com/blog/642607
博文链接:https://shaqiang32.iteye.com/blog/201319
Hibernate的继承映射 --每个继承层次一张表 -- 每个具体类一张表 -- 每个类一张表
这种映射方式只需为继承关系树的Employee根类创建一张表EMPLOYEES。如图14-4所示,在EMPLOYEES表中不仅提供和Employee类的属性对应的字段,还要提供和它的两个子类的所有属型对应的字段,此外,EMPLOYEES表中需要...
针对hibernate的继承映射部分做了几个测试的例子,更加直观的阐述了继承映射的几种方式以及对应的表结构方式,文件被分割成3部分 http://download.csdn.net/source/259075 http://download.csdn.net/source/259072 ...
针对hibernate的继承映射部分做了几个测试的例子,更加直观的阐述了继承映射的几种方式以及对应的表结构方式,文件被分割成3部分 http://download.csdn.net/source/259075 http://download.csdn.net/source/259072 ...
该资源包含了一些常用的hibernate关联映射实例。包括一对多,多对多,继承映射,等,是学习hibernate的必备品
Company与Employee类之间为一对多多态关联关系,如果继承关系树的根类对应一个表,或者每个类对应一个表,那么就能映射Company类的employees集合。本节介绍如何映射多对一多态关联。如图14-11所示,ClassD与ClassA为...
Hibernate数据关联映射与继承策略.rar