鍍金池/ 教程/ Java/ Hibernate每個(gè)子類一張表(使用XML文件)實(shí)例
Hibernate繼承映射
Hibernate每個(gè)子類一張表(使用XML文件)實(shí)例
Hibernate快速入門
Hibernate使用注釋
Hibernate使用xml文件的每個(gè)類層次一張表
Hibernate命名查詢
Hibernate每個(gè)層次類一張表(使用注釋)
Hibernate組件映射
Hibernate事務(wù)管理
Hibernate二級(jí)緩存
集合映射Set(使用xml文件)
Hibernate每個(gè)具體類一張表映射(使用XML)
集合映射中的映射列表(使用xml文件)
Hibernate使用Log4j日志記錄(使用properties文件)
Hibernate集合映射
集合Map映射(使用xml文件)
集合Set映射一對(duì)多(使用xml文件)
Hibernate查詢語(yǔ)言(HQL)
Hibernate入門程序
Hibernate標(biāo)準(zhǔn)查詢語(yǔ)言
Hibernate使用Log4j日志記錄(使用xml文件)
Hibernate教程
Hibernate體系結(jié)構(gòu)
Hibernate生成器類
Hibernate通過(guò)many-to-one元素的一對(duì)一映射
集合Map多對(duì)多映射(使用xml文件)
Web應(yīng)用程序使用Hibernate
Hibernate一對(duì)多映射列表實(shí)例(使用xml文件)
Hibernate通過(guò)one-to-one元素的一對(duì)一映射
Hibernate每個(gè)子類一張表(使用注釋)實(shí)例
集合映射中的映射包(使用xml文件)
通過(guò)Bag一對(duì)多映射示例(使用xml文件)
Hibernate緩存
Hibernate每個(gè)具體類一張表映射(使用注釋)

Hibernate每個(gè)子類一張表(使用XML文件)實(shí)例

在每個(gè)子類一張表的情況下,子類映射表與主鍵和外鍵關(guān)系與父類映射表相關(guān)。

類的<joined-subclass>元素用于使用主鍵和外鍵關(guān)系將子類與父對(duì)象進(jìn)行映射。

在這個(gè)例子中,我們將使用hb2ddl.auto屬性自動(dòng)生成表。 所以我們不需要手動(dòng)在數(shù)據(jù)庫(kù)中創(chuàng)建表。

下面來(lái)看看看我們要映射的類的層次結(jié)構(gòu)。

在每個(gè)子類一張表的情況下,數(shù)據(jù)庫(kù)中將有三個(gè)表,每個(gè)表表示一個(gè)特定的類。
類的joined-subclass 元素指定子類。
sub-elementjoined-subclass 的關(guān)鍵子元素用于在子類映射表中生成外鍵。 該外鍵將與父類映射表的主鍵相關(guān)聯(lián)。

每個(gè)表的結(jié)構(gòu)如下:
Employee類的表結(jié)構(gòu) -

CREATE TABLE `emp122` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Regular_Employee類的表結(jié)構(gòu) -

CREATE TABLE `regemp122` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  `bonus` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Contract_Employee類的表結(jié)構(gòu) -

CREATE TABLE `contemp122` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `pay_per_hour` float DEFAULT NULL,
  `contract_duration` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

每個(gè)具體類的表示例

在這個(gè)例子中,我們創(chuàng)建了三個(gè)類,并在employee.hbm.xml文件中提供了這些類的映射。創(chuàng)建一個(gè)項(xiàng)目:inheritance2annotation, 完整的項(xiàng)目結(jié)構(gòu)如下 -

1)創(chuàng)建持久類

您需要?jiǎng)?chuàng)建表示繼承的持久化類。為上面的層次結(jié)構(gòu)類創(chuàng)建三個(gè)類:

文件:Employee.java

package com.yiibai;

public class Employee {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

文件:Regular_Employee.java

package com.yiibai;

public class Regular_Employee extends Employee {
    private float salary;
    private int bonus;

    public float getSalary() {
        return salary;
    }

    public void setSalary(float salary) {
        this.salary = salary;
    }

    public int getBonus() {
        return bonus;
    }

    public void setBonus(int bonus) {
        this.bonus = bonus;
    }
}

文件:Contract_Employee.java

package com.yiibai;

public class Contract_Employee extends Employee {
    private float pay_per_hour;
    private String contract_duration;

    public float getPay_per_hour() {
        return pay_per_hour;
    }

    public void setPay_per_hour(float payPerHour) {
        pay_per_hour = payPerHour;
    }

    public String getContract_duration() {
        return contract_duration;
    }

    public void setContract_duration(String contractDuration) {
        contract_duration = contractDuration;
    }

}

2)在配置文件中添加hbm文件的映射

打開(kāi)hibernate.cfg.xml文件,并添加如下映射資源的項(xiàng):

<mapping resource="employee.hbm.xml"/>

現(xiàn)在配置文件將如下所示:

文件:hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>

    <session-factory>
        <property name="hbm2ddl.auto">update</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <property name="show_sql">true</property>
        <mapping resource="employee.hbm.xml" />
    </session-factory>

</hibernate-configuration>

hbm2ddl.auto屬性定義是用于在數(shù)據(jù)庫(kù)中創(chuàng)建自動(dòng)表。

4)創(chuàng)建存儲(chǔ)持久對(duì)象的類

在這個(gè)類中,我們只是將Employee 對(duì)象存儲(chǔ)在數(shù)據(jù)庫(kù)表中。

文件:MainTest.java

package com.yiibai;

import org.hibernate.*;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

/**
 * 
 * @author by maxsu
 * @copyright http://www.yiibai.com
 * @link download at: http://www.yiibai.com/siteinfo/download.html
 */

public class MainTest {
    public static void main(String[] args) {
        // 但在5.1.0版本匯總,hibernate則采用如下新方式獲?。?        // 1. 配置類型安全的準(zhǔn)服務(wù)注冊(cè)類,這是當(dāng)前應(yīng)用的單例對(duì)象,不作修改,所以聲明為final
        // 在configure("cfg/hibernate.cfg.xml")方法中,如果不指定資源路徑,默認(rèn)在類路徑下尋找名為hibernate.cfg.xml的文件
        final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .configure("hibernate.cfg.xml").build();
        // 2. 根據(jù)服務(wù)注冊(cè)類創(chuàng)建一個(gè)元數(shù)據(jù)資源集,同時(shí)構(gòu)建元數(shù)據(jù)并生成應(yīng)用一般唯一的的session工廠
        SessionFactory sessionFactory = new MetadataSources(registry)
                .buildMetadata().buildSessionFactory();

        /**** 上面是配置準(zhǔn)備,下面開(kāi)始我們的數(shù)據(jù)庫(kù)操作 ******/
        Session session = sessionFactory.openSession();// 從會(huì)話工廠獲取一個(gè)session

        // creating transaction object
        Transaction t = session.beginTransaction();

        Employee e1 = new Employee();
        e1.setName("用戶名-01");

        Regular_Employee e2 = new Regular_Employee();
        e2.setName("yiibai su");
        e2.setSalary(50002);
        e2.setBonus(5);

        Contract_Employee e3 = new Contract_Employee();
        e3.setName("Mina su");
        e3.setPay_per_hour(1010);
        e3.setContract_duration("15 hours");

        session.persist(e1);
        session.persist(e2);
        session.persist(e3);

        t.commit();
        session.close();
        System.out.println("success");
    }
}

執(zhí)行上面代碼運(yùn)行測(cè)試即可,應(yīng)該會(huì)自動(dòng)創(chuàng)建三張表,并插入數(shù)據(jù)。