from employee employee0_ where employee0_.employeeID=
从上面的sql语句可以看到它是从一张表中获取所有的记录。这正是这种继承策略的一个非常大的好处:在这种映射策略下,整棵继承树的所有数据都保存在一张表中,因此不管进行怎样的查询,不管查询继承树中的那一层的实体,底层数据库都只需要在一张表中查询即可,非常方便、高效。
我们在这里给上面的查询代码增加一句:System.out.println(emp.getClass());
依次给empid赋值为:1、2得到的结果如下:
1、class com.hibernate.domain.Employee
2、class com.hibernate.domain.Skiller
有上面的输出结果可知:hibernate能够非常好处理多态查询。
一、采用joined-subclass元素的继承映射
采用这种策略时,父类实例保存在父类表里,而子类实例则有父类表和子类表共同存储。在这种策略下,是将父类与子类共有的属性保存在父类表中,而子类特有的属性,则保存在子类表中,就是说,父类一张表,子类一张表,同时子类表中需要增加父类表的外键。
采用joined-subclass来映射这种策略,并且需要为每个子类使用
映射文件如下:
[html]
通过上面的增加代码,执行添加操作。得到如下结果:


SQL语句如下:
[sql]
Hibernate: insert into department (departmentName) values ( )
Hibernate: insert into employee (employeeName, departmentID) values ( , )
Hibernate: insert into employee (employeeName, departmentID) values ( , )
Hibernate: insert into Skiller (skiller, employee_id) values ( , )
Hibernate: insert into employee (employeeName, departmentID) values ( , )
Hibernate: insert into Sales (sell, employee_id) values ( , )
从上面的SQL语句中也可以看出hibernate对与这种继承映射策略的处理。父类一张表,子类一张表同时子类引用父类外键建立关联关系。
对与这样继承映射策略的查询,hibernate采用表连接方式来获取子类表的信息:
[sql]
Hibernate: select employee0_.employeeID as employeeID2_0_, employee0_.employeeName as employee2_2_0_, employee0_.departmentID as departme3_2_0_, employee0_1_.skiller as skiller3_0_, employee0_2_.sell as sell4_0_, case
when employee0_1_.employee_id is not null then 1
when employee0_2_.employee_id is not null then 2
when employee0_.employeeID is not null then 0 end as clazz_0_
from employee employee0_ left
outer join Skiller employee0_1_
on employee0_.employeeID=employee0_1_.employee_id
left outer join Sales employee0_2_
on employee0_.employeeID=employee0_2_.employee_id
where employee0_.employeeID=
所以当使用joined-subclass继承映射策略,当程序查询子类实例时,需要跨越多个字表查询,其复杂度取决于该子类有多少层父类。这样势必会对查询的性能有些影响。
一、采用union-subclass元素的继承映射
采用这样继承映射策略,父类实例的数据保存在父表中,子类实例的数据仅仅只保存在字表中,没有在附表中有任何记录。在这种继承映射策略下,子表的字段会比父表的字段多。
同时在这种映射策略,既不需要使用辨别者,也不需要使用
映射文件如下:
[html]
注:在这种映射策略下,映射持久化类是不能使用identity主键生成策略。
通过添加操作得到如下的两个子类表:
采用这中映射策略,底层
数据库的数据看起来更加符合正常情况下的数据库设计,不同实体保存在不同的数据表中。
作者:chenssy