精通Hibernate之映射继承关系五

本节的范例程序位于配套光盘的sourcecode/chapter14/14.2目录下,运行该程序前,需要在SAMPLEDB数据库中手工创建COMPANIES表和EMPLOYEES表,然后加入测试数据,相关的SQL脚本文件为/14.2/schema/sampledb.sql。

在DOS命令行下进入chapter14根目录,然后输入命令:

ant -file build2.xml run

就会运行BusinessService类。BusinessService的main()方法调用test()方法,test()方法依次调用以下方法:

findAllHourlyEmployees():检索数据库中所有的HourlyEmployee对象。

findAllEmployees():检索数据库中所有的Employee对象。

loadCompany():加载一个Company对象。

saveEmployee():保存一个Employee对象。

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

tx = session.beginTransaction();

List results=session.find(“from HourlyEmployee”);

tx.commit();

return results;

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

select * from EMPLOYEES where EMPLOYEE_TYPE=’HE’ ;

select * from COMPANIES where ID=1;

在加载HourlyEmployee对象时,还会同时加载与它关联的Company对象。

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

tx = session.beginTransaction();List results=session.find("from Employee");tx.commit();return results;

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

select * from EMPLOYEES;

select * from COMPANIES where ID=1;

在这种映射方式下,Hibernate支持多态查询,对于从EMPLOYEES表获得的查询结果,如果EMPLOYEE_TYPE字段取值为”HE”,就创建HoulyEmployee实例,如果EMPLOYEE_TYPE字段取值为”SE”,就创建SalariedEmployee实例,这些实例所关联的Company对象也被加载。

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

tx = session.beginTransaction();Company company=(Company)session.load(Company.class,new Long(id));Hibernate.initialize(company.getEmployees());tx.commit();

这种映射方式支持多态关联。如果在Company.hbm.xml文件中对employees集合设置了立即检索策略,那么Session的load()方法加载的Company对象的employees集合中包含所有关联的Employee对象。由于本书提供的Company.hbm.xml文件对employees集合设置了延迟检索策略,因此以上程序代码还通过Hibernate类的静态initialize()方法来显式初始化employees集合。

(4)运行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变量引用HourlyEmployee实例,就执行如下insert语句:

insert into EMPLOYEES(ID,NAME,RATE,EMPLOYEE_TYPE,CUSTOMER_ID)

values(5, ‘Mary ‘,300, ‘HE’,1);

以上insert语句没有为SalariedEmployee类的salary属性对应的SALARY字段赋值,因此这条记录的SALARY字段为null。

家!甜蜜的家!天下最美好的莫过於家

精通Hibernate之映射继承关系五

相关文章:

  • 【算法】直接插入排序C语言实现
  • 嵌入式 FAAC1.28 在海思HI3518C/HI3518A平台linux中的编译优化
  • Android 动画animation 深入分析
  • Mybatis极其(最)简(好)单(用)的一个分页插件
  • Ext JS Kitchen Sink [Learning by doing](2)ArrayGrid
  • API开发第三篇:PHP的设计模式之完美的单例模式
  • 使用NGUI时遇到物理引擎错误
  • [redis]redis命令汇总(二)
  • 你感兴趣的文章:

    标签云:

    亚洲高清电影在线, 免费高清电影, 八戒影院夜间, 八戒电影最新大片, 出轨在线电影, 午夜电影院, 在线影院a1166, 在线电影院, 在线观看美剧下载, 日本爱情电影, 日韩高清电影在线, 电影天堂网, 直播盒子app, 聚合直播, 高清美剧, 高清美剧在线观看 EhViewer-E站, E站, E站绿色版, qqmulu.com, qq目录网, qq网站目录,