在每個(gè)子類一張表的情況下,表是根據(jù)持久類創(chuàng)建的,但是它們使用主鍵和外鍵來(lái)重新定義。 所以關(guān)系中不會(huì)有重復(fù)的列。
我們需要在子類中的使用@PrimaryKeyJoinColumn
注釋和在父類指定@Inheritance(strategy = InheritanceType.JOINED)
。
下面來(lái)看看看我們要映射的類的層次結(jié)構(gòu)。
每個(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è)例子中,我們創(chuàng)建了三個(gè)類,并在employee.hbm.xml
文件中提供了這些類的映射。創(chuàng)建一個(gè)項(xiàng)目:inheritance2annotation
, 完整的項(xiàng)目結(jié)構(gòu)如下 -
您需要?jiǎng)?chuàng)建表示繼承的持久化類。為上面的層次結(jié)構(gòu)類創(chuàng)建三個(gè)類:
文件:Employee.java
package com.yiibai;
import javax.persistence.*;
@Entity
@Table(name = "employee103")
@Inheritance(strategy = InheritanceType.JOINED)
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private int id;
@Column(name = "name")
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;
import javax.persistence.*;
@Entity
@Table(name = "regularemployee103")
@PrimaryKeyJoinColumn(name = "ID")
public class Regular_Employee extends Employee {
@Column(name = "salary")
private float salary;
@Column(name = "bonus")
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;
import javax.persistence.*;
@Entity
@Table(name = "contractemployee103")
@PrimaryKeyJoinColumn(name = "ID")
public class Contract_Employee extends Employee {
@Column(name = "pay_per_hour")
private float pay_per_hour;
@Column(name = "contract_duration")
private String contract_duration;
public float getPay_per_hour() {
return pay_per_hour;
}
public void setPay_per_hour(float pay_per_hour) {
this.pay_per_hour = pay_per_hour;
}
public String getContract_duration() {
return contract_duration;
}
public void setContract_duration(String contract_duration) {
this.contract_duration = contract_duration;
}
// setters and getters
}
打開(kāi)hibernate.cfg.xml文
件,并添加如下映射資源的項(xiàng):
<mapping class="com.yiibai.Employee" />
<mapping class="com.yiibai.Contract_Employee" />
<mapping class="com.yiibai.Regular_Employee" />
現(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 class="com.yiibai.Employee" />
<mapping class="com.yiibai.Contract_Employee" />
<mapping class="com.yiibai.Regular_Employee" />
</session-factory>
</hibernate-configuration>
hbm2ddl.auto
屬性定義是用于在數(shù)據(jù)庫(kù)中創(chuàng)建自動(dòng)表。
在這個(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ù)。