以下是一对多中一端set标签的设置
<set name="student" inverse="true" cascade="save-update">
<key column="cid"/>
<one-to-many class="Student"/>
</set>
inverse="true"是放弃维护关联关系的主动权,使得自己在关联对象之前进行数据持久化,存入数据库,最后维护关联关系的对象再进行持久化,以保持数据的完整性,一般一对多关系中在一端子在set标签中写,交出一端主动权,一端先进行数据持久化,多段持有主动权,最后持久化
cascade属性是设置级联操作的也就是在操作一端的数据如果影响到多端数据时会进行级联操作,
cascade="none",cascade="save-update",cascade="delete",cascade="all" cascade="persist"
cascade="delete-orphan",
cascade属性的值常用的设置为以上五项:
none就是不使用级联操作,默认级联是none。
save-update也就是只有对象保存操作(持久化操作)或者是持久化对象的更新操作,才会级联操作关联对象(子对象)。
persist就只是将级联对象也持久化到数据库。
delete对持久化对象的删除操作时会进行级联操作关联对象(子对象)。
all对持久化对象的所有操作都会级联操作关联对象(子对象)。
delete-orphan,在对关联的“一”端中的集合进行操作时,也就是从“一”端的维护一对多关系的集合中删除了某个“多”端的对象(解除关联关系),在同步数据库时,不会将“多”端表中对应的记录删除,而是把“多”端表中的解除了关系的对象的记录中引用“一”端的外键置成了空值。
batch-size这个属性只能够写在set标签中,这个属性带表批量加载,也就是在加载一端的集合属性时会一次加载指定的数量的对象,而不是默认的一个一个的加载,会提高效率,批量加载只能用于延迟加载和立即加载策略,也就是(lazy="true"或者lazy="false")。
lazy="true" 延迟加载,所谓的延迟加载,就是对一端的集合属性的加载策略,就是在不使用到集合中的对象的数据就不会真正的加载集合中的对象数据,而是家在一个代理对象就相当于的一个空的容器。这也就是会出现LazyInitializationException异常,也就是没有初始化这个代理的集合对象,在事先查询到了集合中的对象就会初始化这个对象,如果Session没有关闭就会在查询加载集合中的对象信息,如果提前关闭了Session,当使用集合中的对象信息时就会有这个异常。
fetch="join",这就是使用了预先抓取策略,也就是针对关联的对象的加载策略,在使用到关联对象的信息时会再发送sql语句,如果不使用fetch="join",就会不使用表连接而是先查出一端的关联id再一条一条的发送sql语句查询到关联对象信息,使用了fetch="join"就会使用表连接将关联对象信息直接查寻出来的。fetch="lazy"这个是默认的设置。
注意:
在使用fetch="join"要区分开他和外连接的区别,他不会忽略配置文件中的加载策略,而使用了外连接就会忽略配置文件中使用了外连接的一端的所有加载策略,而替之为立即加载。
例:班级 tream,身份证 Certigicate 学生 student
身份证和学生是一对一关系,班级和学生是一对多的关系。学生对身份证的加载策略是预先抓取,学生对班级是预先抓取,但是班级对学生是延迟加载。
现在使用了外连接
Query q=session.createQuery("from Student as s left join s.team");
as 的语法是取别名的语法。
也就是使用了外连接的来查寻班级,这样就会忽略,学生对象对其所有属性除了使用外连接查寻的属性,而其余都会使用立即加载。
<property name="" column="" type="" not-null="true">,这样也就会使这个属性不能够为空值
查询对象,可以使用get()和load()方法,不过前提是必须知道该对象持久化时的唯一标识,也就是id,和这个对象的类对象。
hibernate的HQL中的select和update语法
select 别名 from 类全名 别名 where 别名.类属性=:变量名
如果要查寻全部可以简写为from 类全名
update 类全名 set 属性名=:变量名 where 属性名=:变量名
注意以上这些语句要在createQuery("...")中。
多对多的映射实现
一般多对多关联会拆分成两个一对多的关系来实现多对多关系,也可以通过hibernate提供的解决方案来实现。其实hibernate的实现方式是通过中间表间接的实现了多对多关系,实际上也是将多对多拆分成两个双向的一对多关系。
多对多关系XML文件的配置
课程类的映射文件
<hibernate-mapping>
<class name="Course" table="course">
<set name="student" table="student_course" inverse="true">
<!--设置中间表的表名-->
<key column="courseid">
<many-to-many column="studentid" class="Student"/>
</set>
<!--
key子标签中标明的被引用的本类对应表的字段,many-to-many子标签是表示关联类在中间表中对应引用字段的
-->
</class>
</hibernate-mapping>
学生类的映射文件
<hibernate-mapping>
<class name="Student" table="student">
<set name="course" table="student_course" cascade="save-update">
<key column="studentid"/>
<many-to-many column="courseid" class="Course"/>
</set>
</class>
</hibernate-mapping>
类继承关系映射
建表策略
1) 所有类建一个表
2) 只为具体类建表
3) 每个类建一个表。
1) 所有类只建一个表,查寻效率比较高,但是会产生很多空间浪费,当子类中的非空约束,就不大适用了,这是对于子类可以使用subclass标签表示。
2) 只为具体类建表,使用于不使用多态的情况下,具体类之间没有继承关系时适用
需要针对每个类写映射配置文件,就和普通的单表映射的xml文件相同。
也可以使用一个xml文件来进行映射,可以通过写union-subclass标签来表现其关系
这里不能使用id生成策略中的native,而是要指定特定的生成策略。
3) 每个类建一个表,可以有效减少数据的冗余,减少字段,查询效率不很高。
正对每个类建一个表,只要写一个配置文件来进行类的映射即可
映射文件中的子类可以使用join-subclass标签来表示,并且引用父类的主键作为共享主键,就是不需要指定id生成策略
注意:
不考虑多态时,最好是用只针对具体类建表,而考虑多态时尽量使用所有类建一个表,只有当子类中的属性过多是才考虑每个类建一个表的策略。
分享到:
相关推荐
**5.3 Hibernate知识辅导(2--2)** - **多对多映射**: 多对多关系的实现方式。 - **级联操作**: 级联保存、删除等操作。 - **延迟加载**: 延迟加载实体及其关联对象。 **5.4 Hibernate知识辅导(2--3)** - **...
2. **Hibernate框架**: Hibernate是一个对象关系映射(ORM)工具,它简化了Java应用与关系数据库之间的交互。在博客系统中,Hibernate作为数据访问层,负责将Java对象与数据库中的表进行映射,提供透明的数据持久...
- JPA/Hibernate:理解ORM框架的工作原理,以及实体关系映射和查询语句的编写。 10. **心理辅导**: - 面试准备:了解如何有效地准备面试,包括对公司和职位的研究,以及自我介绍的技巧。 - 面试技巧:学会如何...
知识点2:SSM 框架 * SSM 框架是 Spring、Struts 和 Hibernate 的整合框架,能够提供一个完整的 Java WEB 开发解决方案。 * SSM 框架提供了一个松耦合的架构,能够使开发者快速构建应用程序。 * SSM 框架的主要特点...
根据给定的文件信息,我们可以提炼出一系列与Java程序设计相关的知识点,这48讲加上额外的2讲辅导课程,涵盖了Java编程的基础到高级技术,是深入理解和掌握Java语言的宝贵资源。以下是对这些知识点的详细说明: ###...
3. **JavaWeb阶段** - **JavaScript DOM编程视频教程**:JavaScript是前端开发的核心语言之一,DOM编程是其中的重要组成部分。 - **jQuery视频教程**:jQuery是一种流行的JavaScript库,简化了HTML文档遍历、事件...
2. **数据库设计**:文件"2-数据库表结构文档"很可能包含了项目的数据库模型,包括各个表的设计、字段定义以及它们之间的关系。这通常涉及到关系型数据库管理系统(如MySQL或Oracle),并且可能运用了实体关系模型...
“3-资料”可能包含相关的学习资料,例如Java编程基础、Spring Boot教程、数据库管理知识等,帮助用户深入理解系统原理,提升开发技能。 六、辅导视频 “5-视频”中的辅导视频是系统的重要补充,通过实例演示,...
2. **技术栈展示**:列出你精通的Java技术,如J2EE、JDBC、多线程、集合框架、设计模式等,并提及你对其他相关技术如Spring Boot、MyBatis、Hibernate的理解和应用。 3. **项目经验**:详细描述你参与过的项目,...
8. **辅导视频**:01-视频可能是一系列的教学视频,帮助学习者理解系统的实现过程,包括编程技巧、问题调试、功能测试等内容,有助于深化理论知识和实践能力。 9. **版本控制**:项目可能使用Git进行版本控制,确保...
最后,"资料"(3-资料)可能是额外的学习资源,如Java编程指南、数据库管理教程、软件工程理论等,这些都能帮助学习者更全面地掌握相关知识。 综上所述,这个基于Java的人力资源管理系统项目不仅提供了实践经验,也...
- 数据库:MySQL或Oracle存储用户信息、作业、成绩等数据,使用JDBC进行数据库操作,可能结合Hibernate或MyBatis简化ORM(对象关系映射)。 - 前端:HTML、CSS和JavaScript,可能使用Bootstrap或Vue.js等框架提升...
这个项目的重点在于理解和应用Java编程语言来构建一个实用的业务系统,同时也涉及到数据库管理和系统部署的相关知识。 1. **Java编程基础**:Java是一种面向对象的编程语言,它的特性包括平台独立性、丰富的类库和...
4. **框架应用**:可能使用了Spring框架进行依赖注入和事务管理,Spring MVC进行Web层的处理,还有可能使用MyBatis或Hibernate作为ORM(对象关系映射)工具,简化数据库操作。 5. **Eclipse或IntelliJ IDEA等IDE的...
该系统主要利用了Spring、Struts2和Hibernate框架来设计并实现自动化的考试座位编排功能,从而替代了传统的人工排座方式。系统的设计和实现可以有效避免人工操作中可能出现的错误,减轻教务人员的工作负担,并且提升...
2. **MVC设计模式**:作为常见的软件架构模式,Model-View-Controller(模型-视图-控制器)模式被广泛应用在该管理系统中。模型负责数据处理,视图负责显示,控制器处理用户输入并协调模型和视图,保证了业务逻辑与...