在現實中,很多對同一類的事物也有很多區別。這時候我們可以使用繼承。比如說學生,老師可以繼承人這個類。
同理:員工也有普通員工和技術員工和銷售人員工。我們拿員工來舉例子。技術員工有技術,銷售人員工有銷售額。
看這個表結構
所以我們要實現表的繼承。我們可以有一種方法,就是利用鑒別器來實現不同員工的區別。這個方法,其實是在一張表中操作。意思就是說我有一個表表裡有一個類別欄位,這個欄位起標記作用。當坐上不同標記的時候,他就填寫表中屬於自己的欄位。當然這個的缺點就是表中會有很多空欄位。
現在我寫一個執行個體:
首先是員工類,是一個基類
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();
}
}
我們看看在資料庫中的結果
所以總是有空欄位。下一篇為大家說另一種方法。