知识大全 精通Hibernate之映射继承关系(二)
Posted 文件
篇首语:实践是知识的母亲,知识是生活的明灯。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 精通Hibernate之映射继承关系(二)相关的知识,希望对你有一定的参考价值。
精通Hibernate之映射继承关系(二) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
把每个具体类映射到一张表是最简单的映射方式 如图 所示 在关系数据模型中只需定义PANIES HOURLY_EMPLOYEES和SALARIED_EMPLOYEES表 为了叙述的方便 下文把HOURLY_EMPLOYEES表简称为HE表 把SALARIED_EMPLOYEES表简称为SE表
HourlyEmployee类和HE表对应 HourlyEmployee类本身的rate属性 以及从Employee类中继承的id属性和name属性 在HE表中都有对应的字段 此外 HourlyEmployee类继承了Employee类与Company类的关联关系 与此对应 在HE表中定义了参照PANIES表的PANY_ID外键
SalariedEmployee类和SE表对应 SalariedEmployee类本身的salary属性 以及从Employee类中继承的id属性和name属性 在SE表中都有对应的字段 此外 SalariedEmployee类继承了Employee类与Company类的关联关系 与此对应 在SE表中定义了参照PANIES表的PANY_ID外键
Company类 HourlyEmployee类和SalariedEmployee类都有相应的映射文件 而Employee类没有相应的映射文件 图 显示了持久化类 映射文件和数据库表之间的对应关系
图 每个具体类对应一个表
图 持久化类 映射文件和数据库表之间的对应关系
如果Employee类不是抽象类 即Employee类本身也能被实例化 那么还需要为Employee类创建对应的EMPLOYEES表 此时HE表和SE表的结构仍然和图 中所示的一样 这意味着在EMPLOYEES表 HE表和SE表中都定义了相同的NAME字段以及参照PANIES表的外键PANY_ID 另外 还需为Employee类创建单独的Employee hbm xml文件
创建映射文件
从Company类到Employee类是多态关联 但是由于关系数据模型没有描述Employee类和它的两个子类的继承关系 因此无法映射Company类的employees集合 例程 是Company hbm xml文件的代码 该文件仅仅映射了Company类的id和name属性
例程 Company hbm xml
<hibernate mapping > <class name= mypack Company table= PANIES > <id name= id type= long column= ID > <generator class= increment /> </id> <property name= name type= string column= NAME /> </class> </hibernate mapping>
HourlyEmployee hbm xml文件用于把HourlyEmployee类映射到HE表 在这个映射文件中 除了需要映射HourlyEmployee类本身的rate属性 还需要映射从Employee类中继承的name属性 此外还要映射从Employee类中继承的与Company类的关联关系 例程 是HourlyEmployee hbm xml文件的代码
例程 HourlyEmployee hbm xml
<hibernate mapping > <class name= mypack HourlyEmployee table= HOURLY_EMPLOYEES > <id name= id type= long column= ID > <generator class= increment /> </id> <property name= name type= string column= NAME /> <property name= rate column= RATE type= double /> <many to one name= pany column= PANY_ID class= mypack Company /> </class> </hibernate mapping>
SalariedEmployee hbm xml文件用于把SalariedEmployee类映射到SE表 在这个映射文件中 除了需要映射SalariedEmployee类本身的salary属性 还需要映射从Employee类中继承的name属性 此外还要映射从Employee类中继承的与Company类的关联关系 例程 是SalariedEmployee hbm xml文件的代码
例程 SalariedEmployee hbm xml
<hibernate mapping > <class name= mypack SalariedEmployee table= SALARIED_EMPLOYEES > <id name= id type= long column= ID > <generator class= increment /> </id> <property name= name type= string column= NAME /> <property name= salary column= SALARY type= double /> <many to one name= pany column= PANY_ID class= mypack Company /> </class> </hibernate mapping>
由于Employee类没有相应的映射文件 因此在初始化Hibernate时 只需向Configuration对象中加入Company类 HourlyEmployee类和SalariedEmployee类
Configuration config = new Configuration()
config addClass(Company class)
addClass(HourlyEmployee class)
addClass(SalariedEmployee class)
操纵持久化对象
这种映射方式不支持多态查询 在本书第 章的 节(多态查询)介绍了多态查询的概念 对于以下查询语句
List employees=session find( from Employee )
为了检索所有的Employee对象 必须分别检索所有的HourlyEmployee实例和SalariedEmployee实例 然后把它们合并到同一个集合中 在运行Session的第一个find()方法时 Hibernate执行以下select语句
select * from HOURLY_EMPLOYEES
select * from PANIES where ID=
从HourlyEmployee类到Company类不是多态关联 在加载HourlyEmployee对象时 会同时加载与它关联的Company对象
在运行Session的第二个find()方法时 Hibernate执行以下select语句
select * from SALARIED_EMPLOYEES
从SalariedEmployee类到Company类不是多态关联 在加载SalariedEmployee对象时 会同时加载与它关联的Company对象 在本书提供的测试数据中 所有HourlyEmployee实例和SalariedEmployee实例都与OID为 的Company对象关联 由于该Company对象已经被加载到内存中 所以Hibernate不再需要执行检索该对象的select语句
( )运行loadCompany()方法 它的代码如下
tx = session beginTransaction(); Company pany=(Company)session load(Company class new Long(id)); List hourlyEmployees=session find( from HourlyEmployee h where pany id= +id); pany getEmployees() addAll(hourlyEmployees); List salariedEmployees=session find( from SalariedEmployee s where pany id= +id); pany getEmployees() addAll(salariedEmployees); mit(); return pany;
由于这种映射方式不支持多态关联 因此由Session的load()方法加载的Company对象的employees集合中不包含任何Employee对象 BusinessService类必须负责从数据库中检索出所有与Company对象关联的HourlyEmployee对象以及SalariedEmployee对象 然后把它们加入到employees集合中
( )运行saveEmployee(Employee employee)方法 它的代码如下
tx = session beginTransaction()
session save(employee)
mit()
在test()方法中 创建了一个HourlyEmployee实例 然后调用saveEmployee()方法保存这个实例
Employee employee=new HourlyEmployee( Mary pany)
saveEmployee(employee)
Session的save()方法能判断employee变量实际引用的实例的类型 如果employee变量引用HourlyEmployee实例 就向HE表插入一条记录 执行如下insert语句
insert into HOURLY_EMPLOYEES(ID NAME RATE CUSTOMER_ID)
values( Mary )
cha138/Article/program/Java/ky/201311/27877相关参考
精通Hibernate之映射继承关系八 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 由于关系数
精通Hibernate之映射继承关系(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在域模
精通Hibernate之映射继承关系三 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! <h
精通Hibernate之映射继承关系四(图) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 这种
精通Hibernate之映射继承关系七(图) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Co
一对象关系映射基础 对象间的基本关系 首先我简要阐明一下对象之间的基本关系在这以后UML的课程中也会深入的学习对象具有的四种基本关系 关联关系关联关系在设计模式中是被提倡优先使用于继承关系的
Hibernate各种映射关系总结 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 多对一 第一
HibernateORM对象-关系映射 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Hiber
精通Hibernate:映射对象标识符 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java语
Hibernate的继承关系 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一每个子类对应一个数据表