快速业务通道

精通Hibernate之映射继承关系三 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
employee=new HourlyEmployee("Mary",300,company); saveEmployee(employee); } private void printAllEmployees(Iterator it){ while(it.hasNext()){ Employee e=(Employee)it.next(); if(e instanceof HourlyEmployee){ System.out.println(((HourlyEmployee)e).getRate()); }else System.out.println(((SalariedEmployee)e).getSalary()); } } public static void main(String args[]) throws Exception { new BusinessService().test(); sessionFactory.close(); } } BusinessService的main()方法调用test()方法,test()方法依次调用以下方法。 findAllEmployees():检索数据库中所有的Employee对象。 loadCompany():加载一个Company对象。 saveEmployee():保存一个Employee对象。

精通Hibernate之映射继承关系三(3)

时间:2011-08-09

(1)运行findAllEmployees()方法,它的代码如下:

List results=new ArrayList(); tx = session.beginTransaction(); List hourlyEmployees=session.find("from HourlyEmployee"); results.addAll(hourlyEmployees); List salariedEmployees=session.find("from SalariedEmployee"); results.addAll(salariedEmployees); tx.commit(); return results;   

为了检索所有的Employee对象,必须分别检索所有的HourlyEmployee实例和SalariedEmployee实例,然后把它们合并到同一个集合中。在运行Session的第一个find()方法时,Hibernate执行以下select语句:

select * from HOURLY_EMPLOYEES;

select * from COMPANIES where ID=1;

从HourlyEmployee类到Company类不是多态关联,在加载HourlyEmployee对象时,会同时加载与它关联的Company对象。

在运行Session的第二个find()方法时,Hibernate执行以下select语句:

select * from SALARIED_EMPLOYEES;

从SalariedEmployee类到Company类不是多态关联,在加载SalariedEmployee对象时,会同时加载与它关联的Company对象。在本书提供的测试数据中,所有HourlyEmployee实例和SalariedEmployee实例都与OID为1的Company对象关联,由于该Company对象已经被加载到内存中,所以Hibernate不再需要执行检索该对象的select语句。

(2)运行loadCompany()方法,它的代码如下:

tx = session.beginTransaction(); Company company=(Company)session.load(Company.class,new Long(id)); List hourlyEmployees=session.find("from HourlyEmployee h where h.company.id="+id); company.getEmployees().addAll(hourlyEmployees); List salariedEmployees=session.find("from SalariedEmployee s where s.company.id="+id); company.getEmployees().addAll(salariedEmployees); tx.commit(); return company;

由于这种映射方式不支持多态关联,因此由Session的load()方法加载的Company对象的employees集合中不包含任何Employee对象。BusinessService类必须负责从数据库中检索出所有与Company对象关联的HourlyEmployee对象以及SalariedEmployee对象,然后把它们加入到employees集合中。

精通Hibernate之映射继承关系三(4)

时间:2011-08-09

(3)运行saveEmployee(Employee employee)方法,它的代码如下:

tx = session.beginTransaction(); session.save(employee); tx.commit();

在test()方法中,创建了一个HourlyEmployee实例,然后调用saveEmployee()方法保存这个实例:

Employee employee=new HourlyEmployee("Mary",300,company);

saveEmployee(employee);

Session的save()方法能判断employee变量实际引用的实例的类型,如果employee变量引用HourlyEm

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号