在每個具體類一個表中,數據庫中將有三個表但彼此之間沒有關系(關聯)。 根據具體類策略將表格映射到表有兩種方法。
- 由
union-subclass元素指定 - 通過自我為每個類創建表
我們來了解映射的層次結構。

下面來看看看我們如何通過union-subclass元素映射這個層次結構, employee.hbm.xml文件的內容如下
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!--// by http://www.yiibai.com/hibernate --> <hibernate-mapping> <class name="com.yiibai.Employee" table="emp122"> <id name="id"> <generator class="increment"></generator> </id> <property name="name"></property> <union-subclass name="com.yiibai.Regular_Employee" table="regemp122"> <property name="salary"></property> <property name="bonus"></property> </union-subclass> <union-subclass name="com.yiibai.Contract_Employee" table="contemp122"> <property name="pay_per_hour"></property> <property name="contract_duration"></property> </union-subclass> </class> </hibernate-mapping>
在每個具體類一張表的情況下,數據庫中將有三個表,每個表表示一個特定的類。
類的union-subclass子元素指定子類。 它將父表的列添加到此表中。換句話說,將它們作為一個聯合。
每個表的格結構如下:Employee類的表結構 -
CREATE TABLE `emp122` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Regular_Employee類的表結構 -
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類的表結構 -
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;
每個具體類的表示例
在這個例子中,我們創建了三個類,並在employee.hbm.xml文件中提供了這些類的映射。創建一個項目:inheritance2, 完整的項目結構如下 -
1)創建持久類
您需要創建表示繼承的持久化類。 讓我們為上面的層次結構創建三個類:
文件: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; /** * * @author by maxsu * @copyright http://www.yiibai.com * @link download at: http://www.yiibai.com/siteinfo/download.html */ 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; /** * * @author by maxsu * @copyright http://www.yiibai.com * @link download at: http://www.yiibai.com/siteinfo/download.html */ 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)創建持久類的映射文件
上面已經了解了層次結構,接下來看看映射配置。
文件:employee.hbm.xml
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.yiibai.Employee" table="emp122"> <id name="id"> <generator class="increment"></generator> </id> <property name="name"></property> <union-subclass name="com.yiibai.Regular_Employee" table="regemp122"> <property name="salary"></property> <property name="bonus"></property> </union-subclass> <union-subclass name="com.yiibai.Contract_Employee" table="contemp122"> <property name="pay_per_hour"></property> <property name="contract_duration"></property> </union-subclass> </class> </hibernate-mapping>
3)在配置文件中添加hbm文件的映射
打開hibernate.cfg.xml文件,並添加如下映射資源的項:
<mapping resource="employee.hbm.xml"/>
現在配置文件將如下所示:
文件: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屬性定義是用於在數據庫中創建自動表。
4)創建存儲持久對象的類
在這個類中,我們只是將Employee 對象存儲在數據庫表中。
文件: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. 配置類型安全的准服務注冊類,這是當前應用的單例對象,不作修改,所以聲明為final // 在configure("cfg/hibernate.cfg.xml")方法中,如果不指定資源路徑,默認在類路徑下尋找名為hibernate.cfg.xml的文件 final StandardServiceRegistry registry = new StandardServiceRegistryBuilder() .configure("hibernate.cfg.xml").build(); // 2. 根據服務注冊類創建一個元數據資源集,同時構建元數據並生成應用一般唯一的的session工廠 SessionFactory sessionFactory = new MetadataSources(registry) .buildMetadata().buildSessionFactory(); /**** 上面是配置准備,下面開始我們的數據庫操作 ******/ Session session = sessionFactory.openSession();// 從會話工廠獲取一個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"); } }
執行上面代碼運行測試即可,應該會自動創建三張表,並插入數據。
