| |
本节的范例程序位于配套光盘的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。
|
|