hiernate利用鑒別器實現繼承關係(加圖片)

來源:互聯網
上載者:User

在現實中,很多對同一類的事物也有很多區別。這時候我們可以使用繼承。比如說學生,老師可以繼承人這個類。

同理:員工也有普通員工和技術員工和銷售人員工。我們拿員工來舉例子。技術員工有技術,銷售人員工有銷售額。

看這個表結構

所以我們要實現表的繼承。我們可以有一種方法,就是利用鑒別器來實現不同員工的區別。這個方法,其實是在一張表中操作。意思就是說我有一個表表裡有一個類別欄位,這個欄位起標記作用。當坐上不同標記的時候,他就填寫表中屬於自己的欄位。當然這個的缺點就是表中會有很多空欄位。

 

現在我寫一個執行個體:

首先是員工類,是一個基類

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();

    }

}

我們看看在資料庫中的結果

所以總是有空欄位。下一篇為大家說另一種方法。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.