继承映射

来源:互联网 发布:庆应大学留学知乎 编辑:程序博客网 时间:2024/06/05 11:29

继承映射

继承是面向对象编程中一个很重要的特征,在做面向对象的分析与设计时,经常会设计出具体继承关联的持久化类,如何把这些持久化类之间的继承关系映射到关系数据库上的问题已解决。继承在对象模型和关系模型上是不匹配的。

方式一:整个的继承体系就用一张表。设计一张表employee

Id name   depart_id  type  skill    sell

                                                 0            null     null

1                 Coding   null

2                 Null     100

 public class Employee {

    private int id;

    private String name;

    private Department depart;

    //默认的构造方法

    //getter和setter方法

}

public class Skiller extends Employee {

    private String name;

    private String skill;

//默认的构造方法

    //getter和setter方法

}

public class Sales extends Employee {

    private int sell;

//默认的构造方法

    //getter和setter方法

}

映射文件

<classname="Employee" table="employee" discriminator-value="0"><!--unsaved-value="-1"来指定 -->

       <id name="id"column="id">

           <generator class="native"/><!-- native主键的生成器  自动增长 -->

       </id>

       <discriminator column="type"type="int"/>

       <property name="name"not-null="true"/><!-- 映射普通的java属性 -->

       <many-to-one name="depart"column="depart_id"/>

      

       <subclass name="Skiller"discriminator-value="1">

       <property name="skill"></property>

       </subclass>

       <subclass name="Sales"discriminator-value="2">

       <property name="sell"></property>

       </subclass>

    </class>

Type——鉴别器

方式二:每个子类一张表,存放子类所特有的属性(joined)

Employee                                  skiller                sales

Id name  depart_id      employee_id skill       employee_id sell

<classname="Employee" table="emplyee">

    <id name="id">

    <generator class="native"></generator>

    </id>

    <property name="name"not-null="true"/><!-- 映射普通的java属性 -->

    <many-to-one name="depart" column="depart_id"/>

    <joined-subclass name="Skiller" table="skiller">

       <key column="employee_id"></key>

       <property name="skill"></property>

    </joined-subclass>

    <joined-subclass name="Sales" table="sales">

    <key column="employee_id"/>

    <property name="sell"/>

    </joined-subclass>

    </class>

方式三:混合使用“一个类继承体系一张表”和“每个子类一张表”

Employee                                                                    type

Id name  depart_id  type skill         employee_id   sell

<classname="Employee" table="employee" discriminator-value="0">

    <id name="id">

    <generator class="native"></generator>

    </id>

    <discriminator column="type" type="int"/>

    <property name="name"not-null="true"/><!-- 映射普通的java属性 -->

    <many-to-one name="depart" column="depart_id"/>

    <subclass name="Skiller" discriminator-value="1">

    <property name="skill"/>

    </subclass>

    <subclass name="Sales" discriminator-value="2">

    <join table="sales">

    <key column="employee_id"/>

    <property name="sell"/>

    </join>

    </subclass>

    </class>

方式四:每一个具体类一张表,保存是子类完整信息

<class name="Employee"table="employee">

    <id name="id">

    <generator class="hilo"/>

    </id>

    <property name="name" not-null="true"/><!-- 映射普通的java属性 -->

    <many-to-one name="depart" column="depart_id"/>

    <union-subclass name="Skiller" table="skiller">

    <property name="skill"/>

    </union-subclass>

    <union-subclass name="Sales" table="sales">

    <property name="sell"></property>

    </union-subclass>

    </class>

最后:编写测试类TestExtends.java

package com.hbsi.test;

import org.hibernate.Hibernate;

import org.hibernate.Session;

import org.hibernate.Transaction;

import com.hbsi.domain.Department;

import com.hbsi.domain.Employee;

import com.hbsi.domain.Sales;

import com.hbsi.domain.Skiller;

import com.hbsi.hibernate.utils.HibernateUtil;

public class TestExtends {

    public static void main(String[] args) {

       // TODO Auto-generatedmethod stub

       add();

       //查询

       System.out.println("-------------查询的结果----------------");

       query(1);

    }

    static void add(){

       Session s=null;

       Transaction tx=null;

       try{

           s=HibernateUtil.getSession();

           tx=s.beginTransaction();

           //增加

           Department depart=new Department();

           depart.setName("departmentone");

          

           Employee emp1=new Employee();

           emp1.setName("aaa");

           emp1.setDepart(depart);

          

           Skiller emp2=new Skiller();

           emp2.setName("bbb");

           emp2.setDepart(depart);

           emp2.setSkill("coding");

          

           Sales emp3=new Sales();

           emp3.setName("ccc");

           emp3.setDepart(depart);

           emp3.setSell(1000);

           //保存

           s.save(emp1);

           s.save(emp2);

           s.save(emp3);

           s.save(depart);

           //提交事务

           tx.commit();

       }finally{

           if(s!=null)

              s.close();

       }

    }

    static void query(int empId){

       Session s=null;

       Transaction tx=null;

       try{

           s=HibernateUtil.getSession();

           tx=s.beginTransaction();

           //查询

           Employee emp=(Employee) s.get(Employee.class,empId);

           System.out.println("员工的姓名:"+emp.getName()+" ,员工类型 :"+emp.getClass());

           if(emp instanceof Skiller){

              ((Skiller) emp).getSkill();

           }else if(emp instanceof Sales){

              ((Sales) emp).getSell();

           }

           //提交

           tx.commit();

       }finally{

           if(s!=null)

              s.close();

       }

    }

}

 

原创粉丝点击