Hibernate每個具體類一張表映射(使用XML)


在每個具體類一個表中,數據庫中將有三個表但彼此之間沒有關系(關聯)。 根據具體類策略將表格映射到表有兩種方法。

  • 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> 
XML

在每個具體類一張表的情況下,數據庫中將有三個表,每個表表示一個特定的類。
類的union-subclass子元素指定子類。 它將父表的列添加到此表中。換句話說,將它們作為一個聯合。

每個表的格結構如下:
Employee類的表結構 -

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

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; 
SQL

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; 
SQL

每個具體類的表示例

在這個例子中,我們創建了三個類,並在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; } } 
Java

文件: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; } } 
Java

文件: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; } } 
Java

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> 
XML

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

打開hibernate.cfg.xml文件,並添加如下映射資源的項:

<mapping resource="employee.hbm.xml"/> 
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> 
XML

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"); } } 
Java

執行上面代碼運行測試即可,應該會自動創建三張表,並插入數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM