Hibernate框架-03-01-Hibernate继承关系映射

项目工程地址

https://yxmiaoyu.lanzous.com/b01c67olc 密码:74k5
https://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()
				+ "]";
	}
	
	
	

}


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三种映射方式对比

在这里插入图片描述

在这里插入图片描述

第二种方式查询性能最好。

在这里插入图片描述
第一种方式后期的可维护性差

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44627608/article/details/114300476