文章目录
项目工程地址
https://yxmiaoyu.lanzous.com/b01c67olc 密码:74k5https://yxmiaoyu.lanzous.com/b01c67olc
密码:74k5
具体类就是实体化类
类层次就是继承层次
Table per concrete class 每个具体类对应一张表
多态查询,一条语句,可以查阅两种不同的信息。
每一个类就有一张表,表与表之间没有关系,单独操作。
hbm映射文件配置。
详细内容在HibernateCH03-01项目中
注解方式配置
详细内容在HibernateCH03-02项目中
基类对象不需要实现持久化,就在基类上加上@MappedSuperClass属性
Table per class hierarchy 每个类层次对应一张表
- 关系数据模型支持继承关系和多态。
一个语句多种查询 - 在表中加入额外的字段区分子类的类型,表中包含父类和所有子类的属性对应的字段。
通过额外字段进行判断 - 支持多态查询,就是从数据库中检索父类对象时,同时包含所有子类的对象。
扫描二维码关注公众号,回复:
13070239 查看本文章
hbm映射文件配置
详细内容在HibernateCH03-03项目中
<?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 package="com.hibernate.entity">
<!-- class映射的是基类和数据库表的命名 -->
<class name="Employee" table="TABLE01">
<!-- 映射ID属性 -->
<id name="id">
<generator class="identity"/>
</id>
<!-- 额外字段,区分记录对象 -->
<discriminator column="linshi1"></discriminator>
<!-- 基类中定义的属性 -->
<property name="name"></property>
<!-- 映射每一个子类,name=子类类名,discriminator-value=额外字段取值 -->
<subclass name="HourlyEmployee" discriminator-value="HE">
<!-- 子类中定义的属性,因为是同名 所以colimn省略了 -->
<property name="rate"/>
</subclass>
<subclass name="SalariedEmployee" discriminator-value="SE">
<property name="salary"/>
</subclass>
</class>
</hibernate-mapping>
package com.hibernate.ui;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.hibernate.entity.Employee;
import com.hibernate.entity.HourlyEmployee;
import com.hibernate.entity.SalariedEmployee;
import com.hibernate.util.HibernateUtil;
public class Test {
public static void main(String[] args) {
// HourlyEmployee h =new HourlyEmployee();
// h.setName("h1");
// h.setRate(24.0);
// SaveEmployee(h);
// System.out.println(h.toString());
// SalariedEmployee s = new SalariedEmployee();
// s.setName("s1");
// s.setSalary(30.0);
// SaveEmployee(s);
// System.out.println(s.toString());
getEmployee();
}
private static void SaveEmployee(Employee e) {
Session session=HibernateUtil.openSession();
Transaction tx=session.beginTransaction();
session.save(e);
tx.commit();
session.close();
}
private static void getEmployee() {
Session session=HibernateUtil.openSession();
HourlyEmployee he =session.get(HourlyEmployee.class, new Integer(2));
System.out.println(he);
SalariedEmployee sa =session.get(SalariedEmployee.class,new Integer(1));
System.out.println(sa);
}
}
注解方式配置
详细内容在HibernateCH03-04项目中
![package com.hibernate.entity;
import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;
@Entity
//表示当前类型需要持久化
//继承关系的生成策略
//单一的表
@Table(name="table01")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
//额外字段
@DiscriminatorColumn(name="LINSHI1")
public class Employee {
private Integer id;
private String name;
@Id
@GeneratedValue(generator = "linshi2")
@GenericGenerator(strategy = "increment",name="linshi2")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", getId()=" + getId() + ", getName()=" + getName()
+ ", getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString()
+ "]";
}
}
](https://img-blog.csdnimg.cn/20210307210915583.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI3NjA4,size_16,color_FFFFFF,t_70)
Table per class 每个类对应一个表
每个类都对应一张表,也支持多态查询。
- 在关系数据模型中,用外键参照关系来表示继承关系,子类对应的表中存在外键参照父类对应表的主键。
- 继承关系中的每个类及接口都对应一个表。
- 支持多态查询。
最复杂,多并且外键多。
pk=主键
fk=外键
hbm映射文件配置
详细内容在HibernateCH03-05项目中
<?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 package="com.hibernate.entity">
<!-- class映射的是基类和数据库表的命名 -->
<class name="Employee" table="hibernate_03_05_employee">
<!-- 映射ID属性 -->
<id name="id">
<generator class="identity"/>
</id>
<!-- 基类中定义的属性 -->
<property name="name"></property>
<!-- 映射每一个子类,name=子类类名,table=数据库名-->
<joined-subclass name="HourlyEmployee" table="hibernate_03_05_hourly_employee">
<!-- 子类中定义的属性,因为是同名 所以colimn省略了 -->
<!-- key影射的是子类映射的主键 -->
<key column="employee_id"/>
<property name="rate"/>
</joined-subclass>
<joined-subclass name="SalariedEmployee" table="hibernate_03_05_salaried_employee">
<key column="employee_id"/>
<property name="salary"/>
</joined-subclass>
</class>
</hibernate-mapping>
每保存一个对象,需要执行两个SQL的插入语句。
查询的时候都是链接查询的,
注解文件配置
详细内容在HibernateCH03-06项目中
package com.hibernate.entity;
import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;
@Entity
//表示当前类型需要持久化
//继承关系的生成策略
//单一的表
@Table(name="hibernate_03_05_employee")
@Inheritance(strategy=InheritanceType.JOINED)
public class Employee {
private Integer id;
private String name;
@Id
@GeneratedValue(generator = "linshi2")
@GenericGenerator(strategy = "increment",name="linshi2")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", getId()=" + getId() + ", getName()=" + getName()
+ ", getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString()
+ "]";
}
}
三种映射方式对比
第二种方式查询性能最好。
第一种方式后期的可维护性差