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

Posted 文件

篇首语:实践是知识的母亲,知识是生活的明灯。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 精通Hibernate之映射继承关系(二)相关的知识,希望对你有一定的参考价值。

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

  把每个具体类映射到一张表是最简单的映射方式 如图 所示 在关系数据模型中只需定义PANIES HOURLY_EMPLOYEES和SALARIED_EMPLOYEES表 为了叙述的方便 下文把HOURLY_EMPLOYEES表简称为HE表 把SALARIED_EMPLOYEES表简称为SE表

  HourlyEmployee类和HE表对应 HourlyEmployee类本身的rate属性 以及从Employee类中继承的id属性和name属性 在HE表中都有对应的字段 此外 HourlyEmployee类继承了Employee类与Company类的关联关系 与此对应 在HE表中定义了参照PANIES表的PANY_ID外键

  SalariedEmployee类和SE表对应 SalariedEmployee类本身的salary属性 以及从Employee类中继承的id属性和name属性 在SE表中都有对应的字段 此外 SalariedEmployee类继承了Employee类与Company类的关联关系 与此对应 在SE表中定义了参照PANIES表的PANY_ID外键

  Company类 HourlyEmployee类和SalariedEmployee类都有相应的映射文件 而Employee类没有相应的映射文件 图 显示了持久化类 映射文件和数据库表之间的对应关系

  

  图 每个具体类对应一个表

  

  图 持久化类 映射文件和数据库表之间的对应关系

  如果Employee类不是抽象类 即Employee类本身也能被实例化 那么还需要为Employee类创建对应的EMPLOYEES表 此时HE表和SE表的结构仍然和图 中所示的一样 这意味着在EMPLOYEES表 HE表和SE表中都定义了相同的NAME字段以及参照PANIES表的外键PANY_ID 另外 还需为Employee类创建单独的Employee hbm xml文件

   创建映射文件

  从Company类到Employee类是多态关联 但是由于关系数据模型没有描述Employee类和它的两个子类的继承关系 因此无法映射Company类的employees集合 例程 是Company hbm xml文件的代码 该文件仅仅映射了Company类的id和name属性

  例程 Company hbm xml

  

  <hibernate mapping > <class name= mypack Company table= PANIES > <id name= id type= long column= ID > <generator class= increment /> </id> <property name= name type= string column= NAME /> </class> </hibernate mapping>

  HourlyEmployee hbm xml文件用于把HourlyEmployee类映射到HE表 在这个映射文件中 除了需要映射HourlyEmployee类本身的rate属性 还需要映射从Employee类中继承的name属性 此外还要映射从Employee类中继承的与Company类的关联关系 例程 是HourlyEmployee hbm xml文件的代码

  例程 HourlyEmployee hbm xml

  

  <hibernate mapping > <class name= mypack HourlyEmployee table= HOURLY_EMPLOYEES > <id name= id type= long column= ID > <generator class= increment /> </id> <property name= name type= string column= NAME /> <property name= rate column= RATE type= double /> <many to one name= pany column= PANY_ID class= mypack Company /> </class> </hibernate mapping>

  SalariedEmployee hbm xml文件用于把SalariedEmployee类映射到SE表 在这个映射文件中 除了需要映射SalariedEmployee类本身的salary属性 还需要映射从Employee类中继承的name属性 此外还要映射从Employee类中继承的与Company类的关联关系 例程 是SalariedEmployee hbm xml文件的代码

  例程 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= 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对象 必须分别检索所有的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 )

cha138/Article/program/Java/ky/201311/27877

相关参考

知识大全 精通Hibernate之映射继承关系八

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

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

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

知识大全 精通Hibernate之映射继承关系三

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

知识大全 精通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)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一每个子类对应一个数据表