一 Hibernate继承映射

  我们可以将继承层次结构类与数据库的表映射。

1. 每个层次类一张表

这个层次结构有三个类,Employee是Regular_Employee和Contract_Employee类的超类(父类)。

此层次结构的表结构如下所示:

XML实现

1)创建持久化类

Employee.java

package cn;

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

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

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

}

  2)创建映射文件

在每个类层次结构一个表的情况下,hibernate框架添加了一个标识符列,该框架指定了记录的类型。 它主要用于区分记录。要指定它,必须指定类的 discriminator 子元素。
类的子类subelement指定子类。 在这种情况下,Regular_Employee和Contract_Employee是Employee类的子类。

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="cn.Employee" table="employee">
<id name="id">
<generator class="increment"></generator>
</id>
<discriminator column="type" type="string"></discriminator>
<property name="name"></property> <subclass name = "cn.Regular_Employee" discriminator-value="reg_emp">
<property name="salary"></property>
<property name="bonus"></property>
</subclass> <subclass name = "cn.Contract_Employee" discriminator-value="con_emp">
<property name="pay_per_hour"></property>
<property name="contract_duration"></property>
</subclass> </class> </hibernate-mapping>

  3)在配置文件中增加Employee.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost/test
</property>
<property name="hibernate.connection.username">
root
</property>
<property name="hibernate.connection.password">
root
</property>
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="show_sql">true</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

<!-- List of XML mapping files -->
<mapping resource="cn/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>

  4)测试

package cn;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import com.User; public class Test { public static void main(String[] args) {
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
session.beginTransaction(); Employee emp = new Employee();
emp.setName("emp"); Regular_Employee reg = new Regular_Employee();
reg.setName("reg_emp");
reg.setSalary(10000);
reg.setBonus(1); Contract_Employee con = new Contract_Employee();
con.setName("con_emp");
con.setPay_per_hour(200);
con.setContract_duration("20h"); session.persist(emp);
session.persist(reg);
session.persist(con); session.getTransaction().commit();
session.close();
}
}

  

注解实现

1)创建持久化类

Employee.java

package cn;

import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table; @Entity
@Table(name="employee")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue(value="employeee")
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 cn;

import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity; @Entity
@DiscriminatorValue(value="reg")
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 cn;

import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity; @Entity
@DiscriminatorValue(value="con")
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;
} }

  2)配置文件中增加持久化类

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost/test
</property>
<property name="hibernate.connection.username">
root
</property>
<property name="hibernate.connection.password">
root
</property>
<property name="show_sql">true</property>
<mapping class="cn.Employee"/>
<mapping class="cn.Regular_Employee"/>
<mapping class="cn.Contract_Employee"/>
</session-factory>
</hibernate-configuration>

  3)测试

package cn;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration; public class Test { public static void main(String[] args) { SessionFactory factory = new AnnotationConfiguration().configure().buildSessionFactory();
Session session = factory.openSession();
Transaction t = session.beginTransaction(); t.begin(); Employee emp = new Employee();
emp.setName("emp"); Regular_Employee reg = new Regular_Employee();
reg.setName("reg_emp");
reg.setSalary(10000);
reg.setBonus(1); Contract_Employee con = new Contract_Employee();
con.setName("con_emp");
con.setPay_per_hour(200);
con.setContract_duration("20h"); session.persist(emp);
session.persist(reg);
session.persist(con); t.commit(); session.close(); } }

  

2. 每个具体类一张表

数据库中将有三个表,彼此之间没有关系。

XML实现

1) 创建持久化类

Employee.java

package cnn;

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

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

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

  

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="cnn.Employee" table="employee">
<id name="id">
<generator class="increment"></generator>
</id>
<property name="name"></property> <union-subclass name = "cnn.Regular_Employee" table="regular" >
<property name="salary"></property>
<property name="bonus"></property>
</union-subclass> <union-subclass name = "cnn.Contract_Employee" table="contract">
<property name="pay_per_hour"></property>
<property name="contract_duration"></property>
</union-subclass> </class> </hibernate-mapping>

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

 	<!-- List of XML mapping files -->
<mapping resource="cnn/Employee.hbm.xml"/>

4)测试

package cnn;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import com.User; public class Test { public static void main(String[] args) {
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
session.beginTransaction(); Employee emp = new Employee();
emp.setName("emp"); Regular_Employee reg = new Regular_Employee();
reg.setName("reg_emp");
reg.setSalary(10000);
reg.setBonus(1); Contract_Employee con = new Contract_Employee();
con.setName("con_emp");
con.setPay_per_hour(200);
con.setContract_duration("20h"); session.persist(emp);
session.persist(reg);
session.persist(con); session.getTransaction().commit();
session.close();
}
}

注解实现

1)创建持久化类

Employee.java

package cnn;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table; @Entity
@Table(name="employee")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
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 cnn;

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table; @Entity
@Table(name = "regular")
@AttributeOverrides({
@AttributeOverride(name = "id", column = @Column(name = "id")),
@AttributeOverride(name = "name", column = @Column(name = "name")) })
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 cnn;

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table; @Entity
@Table(name = "contract")
@AttributeOverrides({
@AttributeOverride(name = "id", column = @Column(name = "id")),
@AttributeOverride(name = "name", column = @Column(name = "name")) })
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;
} }

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

	<mapping class="cnn.Employee"/>
<mapping class="cnn.Regular_Employee"/>
<mapping class="cnn.Contract_Employee"/>

3)测试类

package cnn;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration; public class Test { public static void main(String[] args) { SessionFactory factory = new AnnotationConfiguration().configure().buildSessionFactory();
Session session = factory.openSession();
Transaction t = session.beginTransaction(); t.begin(); Employee emp = new Employee();
emp.setName("emp"); Regular_Employee reg = new Regular_Employee();
reg.setName("reg_emp");
reg.setSalary(20000);
reg.setBonus(12); Contract_Employee con = new Contract_Employee();
con.setName("con_emp");
con.setPay_per_hour(100);
con.setContract_duration("30h"); session.persist(emp);
session.persist(reg);
session.persist(con); t.commit(); session.close(); } }

  

3. 每个子类一张表

在每个子类一张表的情况下,子类映射表与主键和外键的关系与父类映射表相关。

XML实现

1)创建持久化类

Employee.java

package cnnn;

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

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

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

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="cnnn.Employee" table="employee">
<id name="id">
<generator class="increment"></generator>
</id>
<property name="name"></property> <joined-subclass name = "cnnn.Regular_Employee" >
<key column="reg_id"></key>
<property name="salary"></property>
<property name="bonus"></property>
</joined-subclass> <joined-subclass name = "cnnn.Contract_Employee" >
<key column="con_id"></key>
<property name="pay_per_hour"></property>
<property name="contract_duration"></property>
</joined-subclass> </class> </hibernate-mapping>

  

 

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

<mapping resource="cnnn/Employee.hbm.xml"/>

4)测试

package cnnn;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import com.User; public class Test { public static void main(String[] args) {
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
session.beginTransaction(); Employee emp = new Employee();
emp.setName("emp"); Regular_Employee reg = new Regular_Employee();
reg.setName("reg_emp");
reg.setSalary(10000);
reg.setBonus(1); Contract_Employee con = new Contract_Employee();
con.setName("con_emp");
con.setPay_per_hour(200);
con.setContract_duration("20h"); session.persist(emp);
session.persist(reg);
session.persist(con); session.getTransaction().commit();
session.close();
}
}

注解实现

1)创建持久化类

Employee.java

package cnnn;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table; @Entity
@Table(name="employee")
@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 cnnn;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table; @Entity
@Table(name = "regular")
@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;
} }

  

package cnnn;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table; @Entity
@Table(name = "contract")
@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;
} }

2)在配置文件中增加配置

	<mapping class="cnnn.Employee"/>
<mapping class="cnnn.Regular_Employee"/>
<mapping class="cnnn.Contract_Employee"/>

3)测试

package cnnn;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration; public class Test { public static void main(String[] args) { SessionFactory factory = new AnnotationConfiguration().configure().buildSessionFactory();
Session session = factory.openSession();
Transaction t = session.beginTransaction(); t.begin(); Employee emp = new Employee();
emp.setName("emp"); Regular_Employee reg = new Regular_Employee();
reg.setName("reg_emp");
reg.setSalary(20000);
reg.setBonus(12); Contract_Employee con = new Contract_Employee();
con.setName("con_emp");
con.setPay_per_hour(100);
con.setContract_duration("30h"); session.persist(emp);
session.persist(reg);
session.persist(con); t.commit(); session.close(); } }

  

Hibernate入门(五)的更多相关文章

  1. Hibernate入门(五)---------事务管理

    在Hibernate中,可以通过代码来操作管理事务,如通过“Transaction tx = session.beginTransaction()”,开启一个事务,持久化操作后,通过"tx. ...

  2. openresty 前端开发入门五之Mysql篇

    openresty 前端开发入门五之Mysql篇 这章主要演示怎么通过lua连接mysql,并根据用户输入的name从mysql获取数据,并返回给用户 操作mysql主要用到了lua-resty-my ...

  3. 三大框架之hibernate入门

    hibernate入门   1.orm      hibernate是一个经典的开源的orm[数据访问中间件]框架           ORM( Object Relation Mapping)对象关 ...

  4. Hibernate入门案例及增删改查

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...

  5. Hibernate入门案例 增删改

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...

  6. Hibernate入门6.Hibernate检索方式

    Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...

  7. Hibernate入门5持久化对象关系和批量处理技术

    Hibernate入门5持久化对象关系和批量处理技术 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hiberna ...

  8. Hibernate入门4.核心技能

    Hibernate入门4.核心技能 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hibernate3的基本知识, ...

  9. Hibernate入门3.配置映射文件深入

    Hibernate入门3.配置映射文件深入 2013.11.27 前言: 之前的两节是在Java项目中如何使用hibernate,并且通过一个简单地项目实践,期间有很多的错误,一般都是因为配置包的问题 ...

  10. 简单的Hibernate入门简介

    其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了很多非Hibernate的东西, ...

随机推荐

  1. 为linux系统实现回收站

    在linux系统中,经常采用"rm *"或"rm -r *"操作删除一下文件,但是有时某些文件并不是我们想要删除的,但是已经被删除.很多时候都是悲剧的,数据是难 ...

  2. linux操作系统中对大小端的判断

    static union { char c[4]; unsigned long l; } endian_test = { { 'l', '?', '?', 'b' } }; #define ENDIA ...

  3. F# 之旅(上)

    写在前面的话 解答一下在上一篇文章<在Visual Studio中入门F#>中有人的提问, 1. 问:是准备写 F# 系列吗?    答:当然不是,本人也是刚刚学习 F#,只是翻译微软官方 ...

  4. jquery实现网页倒计时

    在毕设作品考试模块要做个倒计时,当时间到时自动结束答题.于是在jQuery插件社区找到一个简洁明了的倒计时.先上效果图. 感谢作者hacker(这是黑客的意思么),贴上地址:http://www.jq ...

  5. IOS中的通知NSNotification

    类似于Android中的广播接收者发送者 1.一般完整的通知包含三个属性 -(NSString *)name ;//通知的名称 -(id)object ;//通知发布者(是谁要发布通知) -(NSDi ...

  6. Java_中建立0-10M的消息(字符串)

    直接用StringBuilder,它的append方法方便快速构建字符串. StringBuilder sb1=new StringBuilder(); for(int i=0;i<1024*1 ...

  7. cookie值的设置,获取及删除

    <script> function setCookie( key, val, expire){ var dateTime = new Date(); dateTime.setTime( d ...

  8. GUI Design Studio——如何创建项目展示文件

    打开一个做好的项目,我这次以系统自带的  welcome项目做示例 选择左上角的File->Create Distribution File... 我需要的是整个项目,所以选择了The whol ...

  9. Swift和Javascript的神奇魔法

    Swift和Javascript的神奇魔法 记录Swift和Javascript如何进行交互 前言 今天在网上看到了一篇介绍Swift和Javascript交互的文章,感觉作者写的很好,因此把作者文章 ...

  10. Lists, Maps and Sets in Java

    ArrayList vs LinkedList vs Vector From the hierarchy diagram, they all implement List interface. The ...