本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.继承映射

  举例:对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念。Hibernate 的继承映射可以理解持久化类之间的继承关系。例如:人和学生之间的关系。学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到。

 

                   [原创]java WEB学习笔记87:Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass  )

 

 

 

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

相关文章:

  • 2022-12-23
  • 2022-01-03
  • 2021-08-27
  • 2021-12-19
  • 2021-09-18
  • 2022-12-23
  • 2022-01-07
  • 2021-11-18
猜你喜欢
  • 2017-12-12
  • 2021-12-02
  • 2022-12-23
  • 2021-04-11
  • 2021-07-12
  • 2022-01-17
  • 2021-09-26
相关资源
相似解决方案