在每个具体类一个表中,数据库中将有三个表但彼此之间没有关系(关联)。 根据具体类策略将表格映射到表有两种方法。
- 由
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"); } }
执行上面代码运行测试即可,应该会自动创建三张表,并插入数据。
