知识大全 精通Hibernate之映射继承关系三
Posted 知
篇首语:知识的价值不在于占有,而在于使用。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 精通Hibernate之映射继承关系三相关的知识,希望对你有一定的参考价值。
精通Hibernate之映射继承关系三 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
<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= pany column= PANY_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); 操纵持久化对象 这种映射方式不支持多态查询 在本书第 章的 节(多态查询)介绍了多态查询的概念 对于以下查询语句 List employees=session find( from Employee ); 如果Employee类是抽象类 那么Hibernate会抛出异常 如果Employee类是具体类 那么Hibernate仅仅查询EMPLOYEES表 检索出Employee类本身的实例 但不会检索出它的两个子类的实例 本节的范例程序位于配套光盘的sourcecode\\chapter \\ 目录下 运行该程序前 需要在SAMPLEDB数据库中手工创建PANIES表 HE表和SE表 然后加入测试数据 相关的SQL脚本文件为\\ \\schema/sampledb sql 在chapter 目录下有四个ANT的工程文件 分别为build xml build xml build xml和build xml 它们的区别在于文件开头设置的路径不一样 例如在build xml文件中设置了以下路径 <property name= source root value= /src /> <property name= class root value= /classes /> <property name= lib dir value= lib /> <property name= schema dir value= /schema /> 在DOS命令行下进入chapter 根目录 然后输入命令 ant file build xml run 就会运行BusinessService类 ANT命令的 file选项用于显式指定工程文件 BusinessService类用于演示操纵Employee类的对象的方法 例程 是它的源程序 例程 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(erator()); Company pany=loadCompany( ); printAllEmployees(pany getEmployees(erator()); Employee employee=new HourlyEmployee( Mary pany); 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对象 ( )运行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); mit(); return results; 为了检索所有的Employee对象 必须分别检索所有的HourlyEmployee实例和SalariedEmployee实例 然后把它们合并到同一个集合中 在运行Session的第一个find()方法时 Hibernate执行以下select语句 select * from HOURLY_EMPLOYEES; select * from PANIES where ID= ; 从HourlyEmployee类到Company类不是多态关联 在加载HourlyEmployee对象时 会同时加载与它关联的Company对象 在运行Session的第二个find()方法时 Hibernate执行以下select语句 select * from SALARIED_EMPLOYEES; 从SalariedEmployee类到Company类不是多态关联 在加载SalariedEmployee对象时 会同时加载与它关联的Company对象 在本书提供的测试数据中 所有HourlyEmployee实例和SalariedEmployee实例都与OID为 的Company对象关联 由于该Company对象已经被加载到内存中 所以Hibernate不再需要执行检索该对象的select语句 ( )运行loadCompany()方法 它的代码如下 tx = session beginTransaction(); Company pany=(Company)session load(Company class new Long(id)); List hourlyEmployees=session find( from HourlyEmployee h where pany id= +id); pany getEmployees() addAll(hourlyEmployees); List salariedEmployees=session find( from SalariedEmployee s where pany id= +id); pany getEmployees() addAll(salariedEmployees); mit(); return pany; 由于这种映射方式不支持多态关联 因此由Session的load()方法加载的Company对象的employees集合中不包含任何Employee对象 BusinessService类必须负责从数据库中检索出所有与Company对象关联的HourlyEmployee对象以及SalariedEmployee对象 然后把它们加入到employees集合中 ( )运行saveEmployee(Employee employee)方法 它的代码如下 tx = session beginTransaction(); session save(employee); mit(); 在test()方法中 创建了一个HourlyEmployee实例 然后调用saveEmployee()方法保存这个实例 Employee employee=new HourlyEmployee( Mary pany); saveEmployee(employee); Session的save()方法能判断employee变量实际引用的实例的类型 如果employee变量引用HourlyEmployee实例 就向HE表插入一条记录 执行如下insert语句 insert into HOURLY_EMPLOYEES(ID NAME RATE CUSTOMER_ID) values( Mary ); 如果employee变量引用SalariedEmployee实例 就向SE表插入一条记录 cha138/Article/program/Java/ky/201311/28808相关参考
精通Hibernate之映射继承关系(二) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 把每个
精通Hibernate之映射继承关系(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在域模
精通Hibernate之映射继承关系二(图) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 把每
精通Hibernate之映射继承关系四(图) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 这种
精通Hibernate之映射继承关系七(图) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Co
一对象关系映射基础 对象间的基本关系 首先我简要阐明一下对象之间的基本关系在这以后UML的课程中也会深入的学习对象具有的四种基本关系 关联关系关联关系在设计模式中是被提倡优先使用于继承关系的
Hibernate各种映射关系总结 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 多对一 第一
HibernateORM对象-关系映射 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Hiber
精通Hibernate:映射对象标识符 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java语
Hibernate的继承关系 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一每个子类对应一个数据表