Java资源网

| JAVA基础 | 环境配置 | JDBC | 线程技术 | Socket编程 | JavaMail | JAVA与XML | 设计模式 | 技术新闻 | Java认证 | 程序人生 软件下载
| JSP&Servlet | Spring | Struts | Hibernate | JBuilder | Eclipse | WebService | EJB技术 | J2ME开发 | 应用服务器 | JXTA | Ajax
Articles search文章搜索
   关键字:
   类 别:
       
New download 最新下载
· [组件]HTML Parser 1.5
· [教程]WebSphere Studio应用教程
· [组件]JDom 1.0
· [工具]Junit3.8.1
· [教程]EJB编程及J2EE系统架构和设计
· [教程]EJB教程
· [教程]J2EE Tutorial中文版
· [教程]Java编程思想2(英文)
· [教程]java编程思想(完整版)
· [教程]Java网络编程
New articles 最新文章
· 设计移动 Web 服务
· 解析XML的时候完全忽略DTD
· 理解XML Schema XML Schema 初步
· 标签库的深入研究
· 提升JSP应用程序的七大绝招
· 如何使用JDOM对XML文件进行操作
· 处理XML字符串中特殊字符
· 利用Digester把XML转换成为Java对象
· 使用WebService 和RMI远程协作
· 使用Axis开发Web Service程序
Articles top 热门文章
· Eclipse基础--plugin插件安装(6644)
· eclipse+tomcat+lomboz的安装配置说明(4774)
· Java程序员就业前景(4584)
· Windows下JAVA环境变量的设置祥解(3788)
· Tomcat下JSP、Servlet和JavaBean环境的配置(3716)
· 使用links方式安装Eclipse插件(3698)
· 一个老程序员的心理话(3533)
· linux下jdk的安装与配置(3459)
· 初学者入门:Structs中基本配置入门(3334)
· Eclipse 运行命令行参数大全(3084)
您的位置:首页>>Hibernate>>精通Hibernate之映射继承关系三
精通Hibernate之映射继承关系三
2006-04-05   来源:赛迪网  作者:孙卫琴
  <hibernate-mapping >
  <class name="mypack.SalariedEmployee" table="SALARIED_EMPLOYEES">
  <id name="id" type="long" column="ID">
  <generator class="increment"/>
  </id>
  
  <property name="name" type="string" column="NAME" />
  <property name="salary" column="SALARY" type="double" />
  
  <many-to-one
  name="company"
  column="COMPANY_ID"
  class="mypack.Company"
  />
  </class>
  </hibernate-mapping>
  
  由于Employee类没有相应的映射文件,因此在初始化Hibernate时,只需向Configuration对象中加入Company类、HourlyEmployee类和SalariedEmployee类:
  
  Configuration config = new Configuration();
  config.addClass(Company.class)
  .addClass(HourlyEmployee.class)
  .addClass(SalariedEmployee.class);
  
  14.1.2 操纵持久化对象
  
  这种映射方式不支持多态查询,在本书第11章的11.1.6节(多态查询)介绍了多态查询的概念。对于以下查询语句:
  
  List employees=session.find("from Employee");
  
  如果Employee类是抽象类,那么Hibernate会抛出异常。如果Employee类是具体类,那么Hibernate仅仅查询EMPLOYEES表,检索出Employee类本身的实例,但不会检索出它的两个子类的实例。本节的范例程序位于配套光盘的sourcecode\chapter14\14.1目录下,运行该程序前,需要在SAMPLEDB数据库中手工创建COMPANIES表、HE表和SE表,然后加入测试数据,相关的SQL脚本文件为\14.1\schema/sampledb.sql。
  
  在chapter14目录下有四个ANT的工程文件,分别为build1.xml、build2.xml、build3.xml和build4.xml,它们的区别在于文件开头设置的路径不一样,例如在build1.xml文件中设置了以下路径:
  
  <property name="source.root" value="14.1/src"/>
  <property name="class.root" value="14.1/classes"/>
  <property name="lib.dir" value="lib"/>
  <property name="schema.dir" value="14.1/schema"/>
  
  在DOS命令行下进入chapter14根目录,然后输入命令:
  
  ant -file build1.xml run
  
  就会运行BusinessService类。ANT命令的-file选项用于显式指定工程文件。BusinessService类用于演示操纵Employee类的对象的方法,例程14-4是它的源程序。
  
  例程14-4 BusinessService.java
  
  public class BusinessService{
  public static SessionFactory sessionFactory;
  static{
  try{
  Configuration config = new Configuration();
  config.addClass(Company.class)
  .addClass(HourlyEmployee.class)
  .addClass(SalariedEmployee.class);
  sessionFactory = config.buildSessionFactory();
  }catch(Exception e){e.printStackTrace();}
  }
  
  public void saveEmployee(Employee employee) throws Exception{……}
  public List findAllEmployees() throws Exception{……}
  public Company loadCompany(long id) throws Exception{……}
  
  public void test() throws Exception{
  List employees=findAllEmployees();
  printAllEmployees(employees.iterator());
  
  Company company=loadCompany(1);
  printAllEmployees(company.getEmployees().iterator());
  
  Employee 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对象。
  
  (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集合中。
  
  (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变量引用HourlyEmployee实例,就向HE表插入一条记录,执行如下insert语句:
  
  insert into HOURLY_EMPLOYEES(ID,NAME,RATE,CUSTOMER_ID)
  values(3, 'Mary',300,1);
  
  如果employee变量引用SalariedEmployee实例,就向SE表插入一条记录。
  --相关文章--
· 精通Hibernate之映射继承关系四(图) (2007-04-17)
· 精通Hibernate之映射继承关系六 (2007-04-17)
· 精通Hibernate之映射继承关系八 (2007-04-17)
· 精通Hibernate之映射继承关系五 (2007-04-17)
· 精通Hibernate之映射继承关系二(图) (2007-04-17)
· 精通Hibernate之映射继承关系三 (2007-04-17)

版权所有©2005-2006 JAVA资源网 渝ICP备05007591号 虚拟主机 | 关于我们 | 联系方式 | 广告业务 | 网站地图 | 友情链接