例程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 |
由于这种映射方式不支持多态关联,因此由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原理与配置 (359篇文章)
- Hibernate高级特性 (63篇文章)
- Hibernate相关文章 (359篇文章)
- J2SE综合:浅谈java程序发布之 jre 篇 (11次浏览)
- JAVA代码中使用魔法数值 (8次浏览)
- Hibernate缓存管理 (6次浏览)
- JAVA代码应该流畅和结构化 (5次浏览)
- Java JVM设置对性能的影响 (4次浏览)
- 开发框架:深入了解 Struts Validator (3次浏览)
- Java中的通信机制及与C/C API的集成 (1次浏览)
- 用Hibernate实现领域对象的自定义字段 (1次浏览)
- Java语言入门 简述Java语言回收机制 (0次浏览)
- 2008年Java开发者最迫切的五个期望 (0次浏览)



