Hibernate-ch03 继承关系映射

ch03 继承关系映射

如何建表,保持Java中的父子类继承关系–映射起作用

范例:

在这里插入图片描述

一、每个具体类对应一张表

1.建表

具体类,即子类,

如父类不需要持久化,那么不为父类建表

HourlyEmployee

idnamerate

SalaryEmployee

idnamesalary

2.缺点

子类较多、公共属性较多时每张表会存在很多重复字段

这种方式相当于多个单实体映射,未体现多态

3.映射文件

每个具体类建一个映射文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q9fcUihc-1646566955992)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20220228201541338.png)]

4.使用注解

具体类照常

@Entity
@Table(name = "hourly_emloyee")
public class HourlyEmployee extends Employee {

	@Column(name = "rate")
	private double rate;
}

未建表的父类添加@MapperedSuperClass

@MappedSuperclass
public class Employee {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;
	//属性名和表中字段名相同时可以省略column注解,映射文件的column元素也是同样道理
	private String name;

}

二、每个类层次对应一张表

1.建表

它们都属于一类,用一张表来表示,添加一个字段作为区分标志

employee

idnameemployee_typeratesalary

2.好处

支持**多态查询,**就是从数据库中检索父类对象时,同时包含所有子类的对象

3.映射文件

<class name="Employee" table="EMPLOYEE">
    <id name="id">
        <generator class="increment"/>
    </id>       
    <discriminator column="EMPLOYEETYPE" />        
    <property name="name"/>
    <subclass name="HourlyEmployees" discriminator-value="HE">
        <property name="rate"/>
    </subclass>
    <subclass name="SalariedEmployees" discriminator-value="SE">
        <property name="salary"/>
    </subclass>
</class>

1.discriminator:区分标志,不在实体类中出现,只在表中出现,

2.subclass:映射子类

必须紧跟id元素

2.如果 父类本身也需要被持久化,可以在元素中设置 discriminator-value 属性的值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qU0kfqL6-1646566955993)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20220228203043981.png)]

4.多态查询

一次查询可以查出所有子类对象

// 多态查询--通过一次查询能够得到所有子类的对象,是哪个子类就映射为那个子类对象
	public static void findEmployee() {
		// 1.获取Session对象
		Session session = HibernateUtil.openSession();
		// 2.创建查询对象,使用hql
		String queryHql = "from Employee ";
		Query query = session.createQuery(queryHql);
		// 3.执行查询
		List list = query.list();// 包含多条--list;唯一--
		System.out.println(list);
	}

5.使用注解

5.1父类

@Entity
@Table(name="employee")
//继承关系的生成策略
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)//总共一张表
//映射额外字段
@DiscriminatorColumn(name="employee_type")
public class Employee {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTI	TY)
	private Integer id;
	private String name;
}

5.2子类

@Entity
@DiscriminatorValue(value="HE")
public class HourlyEmployee extends Employee{
	private double rate;
}

注意:

  • 只有父类上标注@Table,因为只有这一个表
  • 注意区分标志:父类标注字段名,子类标注字段值

三、每个类对应一张表

1.建表

employee

idname

hourly_employee

idrate

salary_employee

idsalary

2.映射文件

一个映射文件管理三张表

<class name="Employee" table="EMPLOYEE">
    <id name="id">
        <generator class="increment"/>
    </id>       
    <property name="name"/>
    <joined-subclass name="HourlyEmployee" table="HOURLYEMPLOYEE">
        <key column="EMPLOYEEID"/>
        <property name="rate"/>
    </joined-subclass>
    <joined-subclass name="SalariedEmployee"
            table="SALARIEDEMPLOYEE">
        <key column="EMPLOYEEID"/>
        <property name="salary"/>
    </joined-subclass>
</class>

(1)joined-subclass:标识子类

(2)key:子类的主键

3.使用注解

@Entity、@Table都有

3.1父类:

指定继承关系的生成策略。

@Inheritance(strategy=InheritanceType.JOINED)

3.2子类:

指定子类对应表的主键列。

@PrimaryKeyJoinColumn(name="EMPLOYEEID")

既是主键又是外键

不涉及生成策略

四、三种方式的对比

1.实体类一模一样,数据库表不同,映射文件不同

关系数据模型的复杂度查询性能DB的可维护性是否支持多态查询
每个具体类一张表每个具体类中包含重复字段如果查父类,就得查所有具体子类的表若父类属性发生变化,须修改所有子类对应的表×
一个大类一张表优:只需创建一个表
缺:表中需额外引入区分子类类型的字段
只需修改一张表
一个类一张表表的数目多,且表之间存在外键参照关系需要连接查询某个类属性发生变化,只需修改该类对应的表
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值