`
dreamer_0924
  • 浏览: 180260 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

精通Hibernate之映射继承关系三

阅读更多
<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:Java持久化对象技术详解[第二版]

    3. **实体映射**:详述如何使用Hibernate的XML映射文件(hbm.xml)或注解来定义Java类与数据库表之间的映射关系,包括字段映射、关联映射(一对一、一对多、多对多)等。 4. **Session与Transaction**:深入理解...

    精通hibernate3.0(第三版).rar

    《精通Hibernate 3.0(第三版)》是Java开发者深入理解对象持久化技术的一本经典教程。本书全面覆盖了Hibernate 3.0的核心概念、API以及最佳实践,旨在帮助读者掌握这一强大的ORM(对象关系映射)框架,提升开发效率...

    精通Hibernate(孙卫琴)

    接着,孙卫琴深入探讨了Hibernate的对象关系映射(ORM)机制,包括实体类的定义、属性注解、主键生成策略、关联映射(一对一、一对多、多对多)以及继承映射等。这些内容让读者能够将Java对象与数据库表进行无缝对接...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第12章 映射继承关系  12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件  12.1.2 操纵持久化对象  12.2 继承关系树的根类对应一个表  12.2.1 创建映射文件  12.2.2 操纵持久化对象  12.3 继承...

    精通Hibernate与参考文档

    这个压缩包包含了两份关键文件:《Hibernate参考文档.chm》和《精通Hibernate:Java对象持久化技术详解.pdf》,旨在帮助开发者深入理解和熟练运用Hibernate这一强大的ORM(对象关系映射)工具。 一、Hibernate简介 ...

    精通Hibernate孙卫琴 pdf

    《精通Hibernate孙卫琴》是Java开发者们广泛阅读的一本技术专著,由知名Java专家孙卫琴撰写。这本书深入浅出地介绍了Hibernate这一强大的对象关系映射(ORM)框架,帮助开发者理解和掌握如何在Java应用程序中高效地...

    精通Hibernate:Java对象持久化技术详解

    《精通Hibernate:Java对象持久化技术详解》一书聚焦于Java开发中的对象持久化技术,主要围绕Hibernate这一流行ORM框架进行深入探讨。Hibernate是Java世界里的重要工具,它简化了数据库操作,使得开发者可以更加专注...

    精通Hibernate源代码

    2. **Chapter 7**:可能涉及对象关系映射(ORM)的细节,包括实体类的定义、属性注解、继承关系的处理等。这是Hibernate的核心功能,它允许我们将Java对象直接映射到数据库表。 3. **Chapter 14**:可能是关于HQL...

    精通Hibernate图书欣赏及PDF阅读器

    首先,Hibernate作为Java领域中最受欢迎的对象关系映射(ORM)框架之一,它允许开发者用面向对象的方式处理数据库操作,避免了SQL语言的直接操作,降低了开发难度。书中会详细介绍Hibernate的核心组件,如...

    精通hibernate源码ch4

    Hibernate遵循Java Persistence API(JPA)标准,提供了丰富的映射机制,包括一对一、一对多、多对一、多对多等各种关系映射,以及继承映射、复合主键等特性,使得对象关系的映射变得简单直观。 总结,精通...

    孙卫琴版的精通hibernate

    接着,她深入讲解了Hibernate的对象模型,包括实体类、持久化属性、继承关系、多对一、一对一、一对多和多对多等关联映射的实现方式。 此外,书中还详细阐述了Hibernate的主要API,如Session、Transaction、Query和...

    孙卫琴.精通Hibernate.zip

    精通Hibernate:Java对象持久化技术详解》这本书深入浅出地介绍了Hibernate这一流行的Java对象关系映射(ORM)框架。Hibernate是Java开发人员在处理数据库操作时常用的工具,它极大地简化了数据库与Java对象之间的...

    精通hibernate(part 2)共分4个part (孙卫琴)

    ### 精通Hibernate(Part 2):深入探索Hibernate框架在J2EE中的应用 #### Hibernate概述 Hibernate是一款开放源代码的对象关系映射(Object Relational Mapping,ORM)框架,它对JDBC进行了非常轻量级的对象封装...

Global site tag (gtag.js) - Google Analytics