1. one端set标签的设置
<set name="acts" cascade="all" inverse="true"><!-- 让one端(user)将关系的维护方交给另一端:many端(Account) -->
<key column="fid"></key>
<one-to-many class="Account"/><!-- 指定集合中存放的是Account类 -->
</set>
注:inverse="true"就是在设置如果在内存中的修改或添加了这个集合中的某一个或某几个对象他不会将全部集合的信息同步到数据库,而是只将集合中被修改的对象重新同步到数据库。
2. many端
<many-to-one name="user" column="fid" cascade="save"><!-- 设置级联操作 -->
</many-to-one>
二.状态
1. 持久对象的状态-->PO外在的状态 (OOAD中 对象的状态-->PO内在的状态)
Transient 暂时状态: po 和Session无关,数据库中也无该记录
Persistent 持久状态: po 和Session有关,数据库中有该记录
Detached 游离/脱管态:po和Session无关,数据库中有该记录
注:和Session关系,即Session中有该对象的副本和该对象的引用
持久化对象: 即就是在数据库中存有其相对应数据的对象,并且在内存中也有这个对象,内部状态和外部状态同步, 这个对象在Session的管理范围内,也就是调用Session.save()方法同步到数据库的对象。
临时对象: 即在内存中刚刚创建(new)的对象,还没有同步到数据库,或者是调用Session.delete(),数据库中信息被删除了的对象。
游离对象: 也就是在数据库中有和该对象向对应的纪录,并且在内存中的也存在该对象,但是不在Session的管理范围之内,如在Session关闭之后,就成了游离对象,就不会在将其改变同步到数据库中.
内在状态-->外在化? 是-->持久态 --否-->暂态
(类属性) (表记录) --是-->Session同步?否-->游离态
2. 状态转换: _|_-->close():关闭Session/clear()清空缓存内对象/evict()清除某个持久对象
save() / saveOrUpdate() close()/clear()/evict()
Transient--------------------->Persistent----------------------->Detached
(临时态)<---------------------(持久态)<----------------------- (游离态)
delete() update()/saveOrUpdate()/lock()
三. 级联操作cascade
cascade属性是设置级联操作的也就是在操作一端的数据如果影响到多端数据时会进行级联操作.
1. none: 就是只对本对象进行操作,不使用级联操作,默认级联是none。
2. save-update: 也就是只有对象保存操作(持久化操作)或者是持久化对象的更新操作,才会级联操作关联对象(子对象),one2many关系中多的那一方会使用;
3. delete: 对持久化对象的删除操作时会进行级联操作关联对象(子对象)。
4. all: 对持久化对象的所有操作都会级联操作关联对象(子对象)。
5. all-delete-orphan: 在多端进行删除操作时,会在多端表中留下null空纪录,设置了级联操作为delete之会将表中表示关联的外键id置成null,不会将这条纪录也删除掉,而把级联设置成delete-orphan就不会留有空纪录,而是级联的把相关纪录删除掉。(级别最深)
cascade="save-update,delete-orphan"
四. 批量更新(Batch update)
1. session.flush()和session.clear()联合使用
2. batch-size: 这个属性写在set标签中,代表批量加载,也就是在加载一端的集合属性时会一次加载指定的数量的对象,而不是默认的一个一个的加载,会提高效率,批量加载只能用于延迟加载和立即加载策略,也就是(lazy="true"或者lazy="false")。
注: lazy="true" 延迟加载,所谓的延迟加载,就是对一端的集合属性的加载策略,就是在不使用到集合中的对象的数据就不会真正的加载集合中的对象数据,而是家在一个代理对象就相当于的一个空的容器。这也就是会出现LazyInitializationException异常,也就是没有初始化这个代理的集合对象,在事先查询到了集合中的对象就会初始化这个对象,如果Session没有关闭就会在查询加载集合中的对象信息,如果提前关闭了Session,当使用集合中的对象信息时就会有这个异常。
五. Hibernate控制的事务(ACID,atomicity consistency isolation durability)事务保证原子操作的不可分,也就是操作的同时成功或同时失败。
Transaction tran=session.beginTranaction();//....事务操作
tran.commit();
tran.rollback();
以上是事务对象的方法,来实现对事务的支持。
六、hibernate的事务隔离级别
hibernate的事务隔离级别和JDBC中大致相同。
设置时要在hibernate.cfg.xml配置
<property name="hibernate.connection.isolation">4</property>
1,读未提交的数据(Read uncommitted isolation)
2,读已提交的数据(Read committed isolation)
4,可重复读级别(Repeatable read isolation)
8,可串行化级别(Serializable isolation)
七、hibernate的锁(悲观锁,乐观锁)
1. 悲观锁: 是由数据库本身所实现的,会对数据库中的数据进行锁定,也就是锁行,在同一时间内只能有一个读写数据操作。
LockMode.UPGRADE,修改锁,在get()方法中加上这个设置作为第三个参数。
LockMode.NONE 无锁机制
LockMode.READ 读取锁(JDBC中的for update)
LockMode.WRITE 写入锁,不能在程序中直接使用
例如:tran = s.beginTransaction();
user = (User)s.get(User.class , userid , LockMode.UPGRADE);
user.setName("new name");
tran.commit();
还可以使用Session.lock() Query.setLockMode() Criteria.setLockMode()方法来设置锁
2. 乐观锁: 也就是通过对记录加上某些信息来解决并发访问的问题。
解决冲突的手段: 加上版本versionNo
if(read_versionNo=versionNo) write versionNo++ else do it again
<version name="version"/>必须紧跟在<id>之后persist就只是将级联对象也持久化到数据库。
分享到:
相关推荐
在提供的文件"hibernate_day03"中,可能包含相关的代码示例和更深入的解释,通过阅读和实践这些内容,你可以更好地掌握Hibernate的抓取策略,特别是对于"many-to-one"关系的应用。记住,理论知识固然重要,但实践...
【传智播客-hibernate框架开发视频第day01-day04资料】 在这个课程中,传智播客为我们深入讲解了Hibernate框架的开发知识,涵盖了从基础到进阶的多个方面。Hibernate是一款强大的对象关系映射(ORM)框架,它为Java...
《Hibernate-day02》 在深入探讨Hibernate-day02这个主题之前,让我们先理解一下Hibernate的基本概念。Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java开发者与数据库之间的交互,允许开发者以面向...
本文将基于黑马程序员2016年的培训资料,对Hibernate的核心概念、配置、使用方法以及最佳实践进行深入探讨。 一、Hibernate框架基础 1.1 ORM概述:ORM是Object-Relational Mapping的缩写,它提供了一种将面向对象...
【hibernate_day02笔记】...以上就是Hibernate_day02笔记中的主要知识点,包括ORM思想、实体类设计、主键策略、操作实体类的方法、对象状态、一级缓存以及事务管理。这些内容构成了使用Hibernate进行数据库操作的基础。
Analytics-90Day-2021-12-18-080027.0003.ips.ca.synced
DAY ONE: BUILDING CONTAINERS WITH KUBERNETES AND CONTRAIL 描述了Juniper的Contrail和k8s的集成
day09-存储管理----
【标题】"黑马程序员 hibernate 2017版讲义资料-day2"涉及的是Java领域中的ORM框架Hibernate的学习资源,主要聚焦于2017年的版本。Hibernate是一个开源的Java库,它允许开发者将数据库操作与Java对象进行映射,从而...
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 ...
- 在1day、2day、3day的源码中,韩顺平老师通过实际的项目案例,演示了如何将上述理论知识应用到实际开发中,涵盖了从简单到复杂的各种场景。 通过这个视频教程和配套的源代码,学习者不仅可以理论结合实践,还能...
【标题】:“黑马程序员 hibernate 2017版讲义资料-day3”涉及的知识点主要围绕Hibernate框架在JavaWeb开发中的应用展开。Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的编程方式来操作...
P1 day01-02. MySQL 高级 - Linux上安装MySQL P2 day01-03. MySQL 高级 - 启动及登录MySQL P3 day01-04. MySQL 高级 - 索引 - 概述 P4 day01-05. MySQL 高级 - 索引 - 优势和劣势 P5 day01-06. MySQL 高级 - 索引 - ...
Nuclear-PBL-Unit-Day-2-Mr.-Klotz's-Web-PagePPT文档.pptx
标题中的"day1_day2-2020-ASN.zip"是一个压缩文件,根据描述,它包含了名为"DAY1-2020"和"DAY2-2020"两个子目录,这些目录下的内容主要是ASN(Abstract Syntax Notation)代码。ASN是一种标准化的编码系统,通常用于...
hibernate框架开发2016版视频 day01 hibernate框架开发2016版视频 day02 hibernate框架开发2016版视频 day03 hibernate框架开发2016版视频 day04
Linux运维-运维构架师-day61-综合架构模块-Zabbix入门-oldboy-03-监控知识基本概述
day01-HTML-CSS-JavaScript