本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用
内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。
本人互联网技术爱好者,互联网技术发烧友
微博:伊直都在0221
QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.继承映射
举例:对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念。Hibernate 的继承映射可以理解持久化类之间的继承关系。例如:人和学生之间的关系。学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到。
1)Hibernate支持三种继承映射策略
① 使用 subclass 进行映射:将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态。
② 使用 joined-subclass 进行映射: 对于继承关系中的子类使用同一个表,这就需要在数据库表中增加额外的区分子类类型的字段。
③ 使用 union-subclass 进行映射:域模型中的每个类映射到一个表,通过关系数据模型中的外键来描述表之间的继承关系。这也就相当于按照域模型的结构来建立数据库中的表,并通过外键来建立表之间的继承关系。
2.采用 subclass 元素的继承映射
1)采用 subclass 的继承映射可以实现对于继承关系中父类和子类使用同一张表
2)因为父类和子类的实例全部保存在同一个表中,因此需要在该表内增加一列,使用该列来区分每行记录到低是哪个类的实例----这个列被称为辨别者列(discriminator).
3)在这种映射策略下,使用 subclass 来映射子类,使用 class 或 subclass 的 discriminator-value 属性指定辨别者列的值
1 <hibernate-mapping package="com.jason.hibernate.entities.subclass">
2
3 <class name="Person" table="PERSONS" discriminator-value="Person">
4
5 <id name="id" type="java.lang.Integer">
6 <column name="ID" />
7 <generator class="native" />
8 </id>
9
10 <!-- 配置辨别者列 -->
11 <discriminator column="TYPE" type="string" ></discriminator>
12
13
14 <property name="name" type="java.lang.String">
15 <column name="NAME" />
16 </property>
17
18 <property name="age" type="int">
19 <column name="AGE" />
20 </property>
21
22 <!-- 映射子类Student,使用subclass 进行映射 -->
23 <subclass name="Student" discriminator-value="Student">
24 <property name="school" type="string" column="SCHOOL"></property>
25 </subclass>
26
27 </class>
28 </hibernate-mapping>
4)所有子类定义的字段都不能有非空约束。如果为那些字段添加非空约束,那么父类的实例在那些列其实并没有值,这将引起数据库完整性冲突,导致父类的实例无法保存到数据库中
5)代码
1 package com.jason.hibernate.entities.subclass; 2 3 public class Person { 4 5 private Integer id; 6 private String name; 7 private int age; 8 9 public Integer getId() { 10 return id; 11 } 12 13 public void setId(Integer id) { 14 this.id = id; 15 } 16 17 public String getName() { 18 return name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25 public int getAge() { 26 return age; 27 } 28 29 public void setAge(int age) { 30 this.age = age; 31 } 32 33 }