Hibernate继承映射.doc
文本预览下载声明
在Java或.Net类与类之间存在关联、聚集和继承关系。一般来说:
关联关系:采用“一对多或一对一”的映射即可;
聚集关系:采用“集和映射”,即映射Set,Bag,List,Map继承关系:本文以下详述
?
因为关系数据库的表之间不存在继承关系,所以Hibernate提供了以下三种对继承关系映射的方法,即在继承关系树中:
(1)、每个具体类(非抽象类)对应一个表:此方式中关系数据模型完全不支持对象的继承关系。
(2)、基类(根类)对应一个表:此方式中对关系数据模型进行非常规设计,在数据库表中加入额外的区分子类的字段,从而使关系数据模型可以支持继承关系。
(3)、每个类对应一个表:此方式中在关系数据模型中用外键关系来表示继承关系。
这三种映射方式都各自有利有弊,需要根据具体情况来选择使用。分别说明一下:
为了说明方便,引用一个比较经典的简单例子
Employee类,它为抽象类,有两个直接子类
HourlyEmployee类,Employee的子类,继承父类的name属性
SalarilyEmployee类,Employee的子类,继承父类的name属性
Company类,它有一个employees集和属性
在此,先这样说明一下啊,日后有时间放个类图上来就一目了然了。
?
继承关系中每个具体类对应一个表
这是最简单的映射方式。基类Employee没用映射,只需要为两个子类提供映射关系即可。看一下映射文件:
hibernate-mapping package=com.wjb.mypack
??? !--Company的映射--
??? class name=Company table=COMPANIES
??????? id name=id type=long column=ID
??????????? generator class=native/
??????? /id
??????? property name=name type=string column=NAME/
??? /class
??? !--HourlyEmployee的映射--
??? class name=HouredEmployee table=HOURLY_EMPLOYEES
??????? id name=id type=long column=ID
??????????? generator class=native/
??????? /id
??????? !--映射从父类继承的name属性--
??????? property name=name type=string column=NAME/
??????? property name=rate type=double column=RATE/
??????? many-to-one name=company
????????????????column=COMPANY_ID class=Company/???????
??? /class
??? !--SalarilyEmployee的映射--
??? class name=SalarilyEmployee table=SALARILY_EMPLOYEES
??????? id name=id type=long column=ID
??????????? generator class=native/
??????? /id
??????? !--映射从父类继承的name属性--
??????? property name=name type=string column=NAME/
??????? property name=salary type=double column=SALARY/
??????? many-to-one name=company
????????????????column=COMPANY_ID class=Company/
??? /class
??? !--注:Employee类没有映射,在DB中不存在对应的表--
/hibernate-mapping
?
可以看出,在这种映射方式中,每个子类除了映射自己的属性外,还需要映射从父类继承来下的属性,这是该映射方式的一个特点。
?
基类(根类)对应一个表
这种映射方式只需为基类Employee创建一个表即可。在表中不仅提供与Employee所有属性的字段,还要提供与所有子类属性对应的字段,此外还需要一个字段用于区分子类的具体类型。此时的映射文件为:
hibernate-mapping package=com.wjb.mypack
??? !--Company的映射--
??? class name=Company table=COMPANIES
?????
显示全部