一. many-tomany(以学生选课为例)
1.Student.hbm.xml文件的设置
<set name="students" table="ying_enrollment" cascade="none"><!--cascade 设置为none,为了减少update更新冗余--!>
<key column="fcid"></key>
<many-to-many class="Student" column="fsid"/>
<!-- table ying_enrollment 中间表,体现多2多关系 -->
</set>
2.Course.hbm.xml文件的设置
<set name="courses" table="ying_enrollment" cascade="save-update" inverse="true"
lazy="false"><!-- lazy表示是否延迟加载set对象,false使Session关闭后仍然可用 -->
<key column="fsid"></key>
<many-to-many class="Course" column="fcid"/>
<!-- table ying_enrollment 中间表,体现多2多关系 -->
</set>
在Student实体类中要设置Student与Course的关联:
public void registerCourse(Course c) {
courses.add(c);
c.getStudents().add(this);
}
3.注: hibernate的实现方式是通过中间表(ying_enrollment),间接实现了多对多关系,实际上也是将多对多拆分
成两个双向的一对多关系。
Hibernate知识点小记
1.cascade
cascade属性是设置级联操作的也就是在操作一端的数据如果影响到多端数据时会进行级联操作,一对一的时候直接写在标签上,其他的要写在set标签上
cascade="none|save-update|all|all-delete-orphan"
none 就是不使用级联操作,默认级联是none。
save-update 也就是只有对象保存操作(持久化操作)或者是持久化对象的更新操作,才会级联操作关联对象(子对象)。
all-delete-orphan,在多端进行删除操作时,会再多端表中留下null空纪录,设置了级联操作为delete之会将表中表示关联的外键id置成null,
不会将这条纪录也删除掉,而把级联设置成delete-orphan就不会留有空纪录,而是级联的把相关纪录删除掉。
2.inverse
inverse="true"就是在设置如果在内存中的修改或添加了这个集合中的某一个或某几个对象他不会将全部集合的信息同步到数据库,而是只将集合中被修改的对象重新同步到数据库
3.lazy
lazy=“true”
延迟加载,所谓的延迟加载,就是对一端的集合属性的加载策略,就是在不使用到集合中的对象的数据就不会真正的加载集合中的对象数据,而是家在一个代理对象就相当于的一个空的容器。这也就是会出现LazyInitializationException异常,也就是没有初始化这个代理的集合对象,在事先查询到了集合中的对象就会初始化这个对象,如果Session没有关闭就会在查询加载集合中的对象信息,如果提前关闭了Session,当使用集合中的对象信息时就会有这个异常。
4.fetch
fetch=“join”,这就是使用了预先抓取策略,也就是针对关联的对象的加载策略,在使用到关联对象的信息时会再发送sql语句,如果不使用fetch=“join”,就会不使用表连接而是先查出一端的关联id再一条一条的发送sql语句查询到关联对象信息,使用了fetch=“join”就会使用表连接将关联对象信息直接查寻出来的。fetch=“lazy”这个是默认的设置。
二. inherit_mapping
建表策略(以Account CheckAccount DebitAccount 类为例)
(1)只为具体类建表只为具体类建表,使用于不使用多态的情况下,具体类之间没有继承关系时适用需要针对每个类写映射配置文件,就和普通的单表映射的xml文件相同。也可以使用一个xml文件来进行映射,可以通过写union-subclass标签来表现其关系这里不能使用id生成策略中的native,而是要指定特定的生成策略。
例:
<union-subclass name="CheckAccount"
table="t_check_account"><!-- 只为具体类建表 -->
<property name="overdraft"></property>
</union-subclass>
<union-subclass name="DebitAccount"
table="t_debit_account"><!-- 只为具体类建表 -->
<property name="currency"></property>
</union-subclass>
(2)每个类建一个表每个类建一个表,可以有效减少数据的冗余,减少字段,查询效率不很高。正对每个类建一个表,只要写一个配置文件来进行类的映射即可映射文件中的子类可以使用join-subclass标签来表示,并且引用父类的主键作为共享主键,就是不需要指定id生成策略
例:
<joined-subclass name="CheckAccount"
table="ying_check_account"><!-- 每一个类建一个表 -->
<key column="faid"></key>
<property name="overdraft"></property>
</joined-subclass>
<joined-subclass name="DebitAccount"
table="ying_debit_account"><!-- 每一个类建一个表 -->
<key column="faid"/>
<property name="currency"></property>
</joined-subclass>
(3)所有类建一个表所有类只建一个表,查寻效率比较高,但是会产生很多空间浪费,当子类中有非空约束,就不大适用了,这是对于子类可以使用subclass标签表示。
例:
<subclass name="CheckAccount"
discriminator-value="c">
<property name="overdraft"></property>
</subclass>
<subclass name="DebitAccount"
discriminator-value="d">
<property name="currency"></property>
</subclass>
注: 不考虑多态时,最好是用只针对具体类建表(2个表),而考虑多态时尽量使用所有类建一个表,
只有当子类中的属性过多是才考虑每个类建一个表的策略。
(4)三种策略的比较:(详见孙卫琴主编的精通Hibernate一书P424)如果不需要支持多态查询和多态关联,可以采用每个具体类对应一个表如果需要持多态查询和多态关联,并且子类包含的属性很多,可以采用所有类对应一个表如果需要持多态查询和多态关联,并且子类包含的属性很多,可以采用每个类对应一个表
分享到:
相关推荐
在提供的文件"hibernate_day03"中,可能包含相关的代码示例和更深入的解释,通过阅读和实践这些内容,你可以更好地掌握Hibernate的抓取策略,特别是对于"many-to-one"关系的应用。记住,理论知识固然重要,但实践...
《Hibernate-day02》 在深入探讨Hibernate-day02这个主题之前,让我们先理解一下Hibernate的基本概念。Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java开发者与数据库之间的交互,允许开发者以面向...
在这个课程中,传智播客为我们深入讲解了Hibernate框架的开发知识,涵盖了从基础到进阶的多个方面。Hibernate是一款强大的对象关系映射(ORM)框架,它为Java开发者提供了便捷的数据访问层,简化了数据库操作。接...
本文将基于黑马程序员2016年的培训资料,对Hibernate的核心概念、配置、使用方法以及最佳实践进行深入探讨。 一、Hibernate框架基础 1.1 ORM概述:ORM是Object-Relational Mapping的缩写,它提供了一种将面向对象...
【hibernate_day02笔记】的文档主要涵盖了学习Hibernate框架的基础内容,包括ORM思想、Hibernate入门案例、配置文件解析、核心API的使用等。以下是详细的讲解: **ORM思想**: ORM(Object-Relational Mapping)即...
- 在1day、2day、3day的源码中,韩顺平老师通过实际的项目案例,演示了如何将上述理论知识应用到实际开发中,涵盖了从简单到复杂的各种场景。 通过这个视频教程和配套的源代码,学习者不仅可以理论结合实践,还能...
【标题】:“黑马程序员 hibernate 2017版讲义资料-day3”涉及的知识点主要围绕Hibernate框架在JavaWeb开发中的应用展开。Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的编程方式来操作...
【标题】:“Hibernate-day01”指的是一个关于Hibernate框架的基础学习教程,可能是一个课程或研讨会的第一天内容。Hibernate是Java开发中的一个对象关系映射(ORM)工具,它简化了数据库与Java对象之间的交互。 ...
day09-存储管理----
hibernate框架开发2016版视频 day01 hibernate框架开发2016版视频 day02 hibernate框架开发2016版视频 day03 hibernate框架开发2016版视频 day04
hibernate_day04笔记
hibernate_day03笔记
This book is your pragmatic day-to-day reference and guide for doing all things involving Hibernate. There are many books focused on learning Hibernate, but this book takes you further and shows how ...
DAY1-H3C-SDN第二章-1 DAY1-H3C-SDN第二章-2. DAY1-H3C-SDN第一章-1. DAY1-H3C-SDN第一章-2 DAY1-下午1 DAY1-下午2 DAY2-上午1 DAY2-下午1 DAY2-下午2 DAY2-下午3 DAY3-上午1 DAY3-下午2 H3C产品和解决方案资料 H3C...
【标题】"黑马程序员 hibernate 2017版讲义资料-day2"涉及的是Java领域中的ORM框架Hibernate的学习资源,主要聚焦于2017年的版本。Hibernate是一个开源的Java库,它允许开发者将数据库操作与Java对象进行映射,从而...
标题中的“PyPI 官网下载 | onegov.election_day-1.4.2-py3-none-any.whl”指的是Python Package Index(PyPI)上发布的onegov.election_day库的1.4.2版本。PyPI是Python社区广泛使用的第三方软件包存储库,开发者...
day3.基本数据类型-序列.md
总结,Hibernate以其强大的ORM能力,简化了Java应用与数据库的交互,降低了开发难度。通过理解和熟练运用其环境搭建、配置以及API,开发者可以更高效地进行数据库操作,提升项目开发效率。在实际应用中,不断探索和...