在每个子类一张表的情况下,子类映射表与主键和外键关系与父类映射表相关。
类的<joined-subclass>
元素用于使用主键和外键关系将子类与父对象进行映射。
在这个例子中,我们将使用hb2ddl.auto
属性自动生成表。 所以我们不需要手动在数据库中创建表。
下面来看看看我们要映射的类的层次结构。
在每个子类一张表的情况下,数据库中将有三个表,每个表表示一个特定的类。
类的joined-subclass
元素指定子类。sub-element
和 joined-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
文件中提供了这些类的映射。创建一个项目:inheritance2annotation
, 完整的项目结构如下 -
您需要创建表示继承的持久化类。为上面的层次结构类创建三个类:
文件:employee.java
package com.h3;
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.h3;
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.h3;
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;
}
}
打开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
属性定义是用于在数据库中创建自动表。
在这个类中,我们只是将employee
对象存储在数据库表中。
文件:maintest.java
package com.h3;
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.h3.com
* @link download at: http://www.h3.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("h3 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");
}
}
执行上面代码运行测试即可,应该会自动创建三张表,并插入数据。