本节的范例程序位于配套光盘的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。
闽公网安备 35060202000074号