在现实中,很多对同一类的事物也有很多区别。这时候我们可以使用继承。比如说学生,老师可以继承人这个类。
同理:员工也有普通员工和技术员工和销售员工。我们拿员工来举例子。技术员工有技术,销售员工有销售额。
看这个表结构
所以我们要实现表的继承。我们可以有一种方法,就是利用鉴别器来实现不同员工的区别。这个方法,其实是在一张表中操作。意思就是说我有一个表表里有一个类别字段,这个字段起标记作用。当坐上不同标记的时候,他就填写表中属于自己的字段。当然这个的缺点就是表中会有很多空字段。
现在我写一个实例:
首先是员工类,是一个基类
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();
}
}
我们看看在数据库中的结果
所以总是有空字段。下一篇为大家说另一种方法。