当前位置:编程学习 > JAVA >>

Hibernate读书笔记---继承映射

 对于面向对象的程序设计语言,继承、多态是两个最基本的概念。Hibernate的继承映射可以理解两个持久化类之间的继承关系。
          Hibernate支持几种继承映射策略,不管哪种继承映射策略,Hibernate的多态查询都可以很好的运行。
          假设有四个对象:Department、Employee、Skiller、Sales。他们四个对象存在如下关系:

          从上面的关系可知:Employee与Department之间存在N-1的关联关系。Skiller和Sales都是Employee的子类。下面是这四个类的代码:
          Department
[java]
public class Department { 
    private Integer id; 
    private String name; 
    private Set<Employee> employees;          //关联关系 
     
    //省略setter和getter方法 

          Employee
[java] 
public class Employee { 
    private Integer id; 
    private String name; 
    private Department department; 
    //省略setter和getter方法 

         Skiller
[java]
public class Skiller extends Employee { 
    private String skiller; 
    //省略setter和getter方法 

          Sales
[java] 
public class Sales extends Employee { 
    private int sell; 
    //省略setter和getter方法 

 
          一、采用subclass元素的继承映射
          在这种继承映射策略下,整个继承树的所有实例都将保存在同一张表中。因为是将父类、子类的实例全部保存在同一张表中,所以需要在该表中添加列,通过该列可以区分每行记录到底是属于哪个类的实例---这个列被称之为辨别者。
          在这种继承映射策略下,我们需要使用<subclass.../>元素来映射子类的持久化类,使用<discrimainator.../>元素来映射辨别者,同时还需要给<subclass.../>元素增加discriminator-value属性来指定每个类的辨别者的值。
          映射文件如下:
[html] 
<hibernate-mapping package="com.hibernate.domain"> 
    <class name="Employee" table="employee"> 
        <id name="id" column="employeeID"> 
            <generator class="hilo" /> 
        </id> 
         <!-- 映射辨别者 --> 
        <discriminator column="type" type="string" /> 
         
        <property name="name" column="employeeName" /> 
        <!-- 用于映射N-1关联实体,指定关联实体类为 :Department,指定外键为:departmentID--> 
        <many-to-one name="department" column="departmentID" />   
         
        <!-- 使用subclass元素映射Employee的子类Skiller -->  
        <subclass name="Skiller" discriminator-value="skiller"> 
            <property name="skiller" /> 
        </subclass> 
         
        <!-- 使用subclass元素映射Employee的子类Sales -->  
        <subclass name="Sales" discriminator-value="sales"> 
            <property name="sell" /> 
        </subclass> 
    </class> 
</hibernate-mapping> 
          在这里我们只需要给父类进行映射就可以了。在这个配置文件中,指定了一个辨别者列:type,该列其本省是没有任何意义的,只是起到一个区分每条记录时对应哪个持久化类的作用。其中Skiller类的辨别者列type的值为skiller,Sales类的辨别者列type的值为sales。通过下面的程序段来进行操作。
[html] 
static void add(){ 
    Session session = HibernateUtil.getSession(); 
    Transaction tx = session.beginTransaction(); 
     
    Department department = new Department(); 
    department.setName("department name1"); 
     
    Employee emp1 = new Employee(); 
    emp1.setName("employy name1"); 
    emp1.setId(1); 
     
    Skiller emp2 = new Skiller(); 
    emp2.setSkiller("电工"); 
    emp2.setName("employee name2"); 
    emp2.setDepartment(department);        //建立对象之间的关联关系 
     
    Sales emp3= new Sales(); 
    emp3.setSell(50); 
    emp3.setName("employee name3"); 
    emp3.setDepartment(department);        //建立对象之间的关联关系 
     
    session.save(department); 
    session.save(emp1); 
    session.save(emp2); 
    session.save(emp3); 
     
    tx.commit(); 
    session.close(); 
     

          上面的程序段,hibernate将会产生如下的几条SQL语句:
[sql] view plaincopyprint?
Hibernate: insert into department (departmentName) values (?) 
 
Hibernate: insert into employee (employeeName, departmentID, type) values (?, ?, 'com.hibernate.domain.Employee') 
 
Hibernate: insert into employee (employeeName, departmentID, skiller, type) values (?, ?, ?, 'skiller') 
 
Hibernate: insert into employee (employeeName, departmentID, sell, type) values (?, ?, ?, 'sales') 

          在第二条sql语句,type的值为com.hibernate.domain.Employee。对于这个值可以理解为空。在第三条sql语句中,type的值为skiller,第四天sql语句中type值为sales。同时要注意第三条sql语句中的sell列是没有值的,第四条的

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,