hiernate利用鉴别器实现继承关系(加图片)

在现实中,很多对同一类的事物也有很多区别。这时候我们可以使用继承。比如说学生,老师可以继承人这个类。

同理:员工也有普通员工和技术员工和销售员工。我们拿员工来举例子。技术员工有技术,销售员工有销售额。

看这个表结构

 

所以我们要实现表的继承。我们可以有一种方法,就是利用鉴别器来实现不同员工的区别。这个方法,其实是在一张表中操作。意思就是说我有一个表表里有一个类别字段,这个字段起标记作用。当坐上不同标记的时候,他就填写表中属于自己的字段。当然这个的缺点就是表中会有很多空字段。

 

现在我写一个实例:

首先是员工类,是一个基类

package com.fish.testdao;

public class Employee{

private Integerid;

private Stringname;

private Departmentdepartment;

public Integer getId() {

    return id;

}

public void setId(Integer id) {

    this.id = id;

}

public String getName() {

    return name;

}

public void setName(String name) {

    this.name = name;

}

public Department getDepartment() {

    return department;

}

public void setDepartment(Department department) {

    this.department = department;

}

}

接着是销售类,继承员工类

package com.fish.testdao;

public class SaleextendsEmployee{

private float money;

public float getMoney() {

    return money;

}

public void setMoney(float money) {

    this.money = money;

}

}

 

还有技术类也继承员工类

package com.fish.testdao;

public class Skill extends Employee{

private Stringkiller;

public String getKiller() {

    return killer;

}

public void setKiller(String killer) {

    this.killer = killer;

}

}

 

那xml怎么写?

<?xmlversion=”1.0″encoding=”UTF-8″?>

<!DOCTYPEhibernate-mapping PUBLIC

    “-//Hibernate/HibernateMapping DTD 3.0//EN”

    “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>

<hibernate-mapping>

    <classname=”com.fish.testdao.Employee”discriminator-value=”0″>

       <idname=”id” column=”id”type=”integer”>

           <generatorclass=”increment”></generator>

       </id>

       <discriminatorcolumn=”type”type=”integer”></discriminator>

       <propertyname=”name”></property>

       <many-to-onename=”department”></many-to-one>

       <subclassname=”com.fish.testdao.Sale”

           discriminator-value=”1″>

           <propertyname=”money”></property>

       </subclass>

       <subclassname=”com.fish.testdao.Skill”

           discriminator-value=”2″>

           <propertyname=”killer”></property>

       </subclass>

    </class>

</hibernate-mapping>

*这里只要写一个xml就行了,<discriminator column=”type”type=”integer”></discriminator>这就是鉴别器的标签。Column就是将来在表中的字段,可以随便写,但是type默认是string。有了鉴别器我们就可以利用这个discriminator-value=”0″来进行鉴别了。当0时候代表普通员工,1代表销售员,2代表技术工。这里value取决于type的类型的。Subclass这个标签就是继承关系的类。Name是你继承的类名,property就是属性。还有discriminator这个标签的位置一定要写对是位于主键的后面。这里就是位于id的后面

接着写一个测试类

package com.fish.domain;

import java.util.List;

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

import com.fish.testdao.Department;

import com.fish.testdao.Skill;

public class Test5 {

    // 写一个得到session的模板

    public static Session getMySession() {

       Configuration configuration = new Configuration();

       configuration.configure(“hibernate.cfg.xml”);

       SessionFactory factory = configuration.buildSessionFactory();

       Session session = factory.openSession();

       return session;

    }

    public static void add() {

       Session session = getMySession();

       Department department = new Department();

       department.setName(“财务部”);

       Skill skill = new Skill();

       skill.setDepartment(department);

       skill.setKiller(“技工”);

       skill.setName(“妮妮”);

       Transaction transaction = session.beginTransaction();

       transaction.begin();

       session.save(department);

       session.save(skill);

       transaction.commit();

       session.close();

    }

    public static void query() {

       String hql = “fromSkill”;

       Session session = getMySession();

       Query query = session.createQuery(hql);

       List<Skill> list = query.list();

       for (Skill i : list) {

           System.out.println(i.getName());

       }

    }

    public static void main(String[] args) {

       // add();

       query();

    }

}

我们看看在数据库中的结果

 

所以总是有空字段。下一篇为大家说另一种方法。

标签