服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

精通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。

扫描关注微信公众号