频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

精通Hibernate之映射继承关系(二)

来源: 作者:佚名 出处:巧巧读书 2008-01-14 进入讨论组
上一页 1 2 
引用:http://www.qqread.com/java/2008/01/i392661.html

  例程14-3 SalariedEmployee.hbm.xml

<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对象,必须分别检索所有的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原理与配置Hibernate高级特性Hibernate相关文章专题,或进入讨论组讨论。
上一页 1 2 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章