知识大全 精通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之映射继承关系(二)

精通Hibernate之映射继承关系(二)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  把每个

知识大全 精通Hibernate之映射继承关系(一)

精通Hibernate之映射继承关系(一)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在域模

知识大全 精通Hibernate之映射继承关系二(图)

精通Hibernate之映射继承关系二(图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  把每

知识大全 精通Hibernate之映射继承关系四(图)

精通Hibernate之映射继承关系四(图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这种

知识大全 精通Hibernate之映射继承关系七(图)

精通Hibernate之映射继承关系七(图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Co

知识大全 hibernate关系映射

  一对象关系映射基础  对象间的基本关系  首先我简要阐明一下对象之间的基本关系在这以后UML的课程中也会深入的学习对象具有的四种基本关系  关联关系关联关系在设计模式中是被提倡优先使用于继承关系的

知识大全 Hibernate各种映射关系总结

Hibernate各种映射关系总结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  多对一  第一

知识大全 Hibernate ORM 对象-关系 映射

HibernateORM对象-关系映射  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hiber

知识大全 映射对象标识符

精通Hibernate:映射对象标识符  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java语

知识大全 Hibernate的继承关系

Hibernate的继承关系  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一每个子类对应一个数据表