7.1 Java对象在JVM中的生命周期
应用程序通过new语句创建一个JAVA对象时,JVM会为这个对象分配一块内存空间,只要这个对象被引用,它就一直存在内存中。如果不被引用了,就结束生命周期,会在适当时候被回收。
7.2 理解Session缓存
Session的save()方法持久化一个对象,这个对象将被加入到Session缓存中,以后即使不再引用这个对象,但是只要Session缓存没有被清空,这个对象仍然会处于生命周期中。
缓存的作用:
1.减少访问数据库的频率。
2.保证缓存中的对象与数据库中的相关记录保持同步。
3.保证不出现访问对象图的死循环,以及由死循环引起的JVM堆栈溢出异常。
清理缓存时,会顺序执行一些SQL语句,具体见书。
默认情况,Session会在下面的时间清理缓存:
1.调用commit()方法时
2.调用find()或者iterate()时,如果缓存中持久化对象的属性变化,则要先清理缓存。
3.调用flush()方法时。此方法与commit()不同之处:此方法清理后不会提交事务。
4.例外情况:如果对象用native生成OID,那么当调用save()方法时,会立即执行insert语句。
如果需要更改Session清理缓存的时间点,用Session的setFlushMode()方法,有三种模式如下:
模式
查询
commit
flush
FlushMode.AUTO
清理
清理
清理
FlushMode.COMMIT
不清理
清理
清理
FlushMode.NEVER
不清理
不清理
清理
设置代码为:session. setFlushMode(FlushMode.COMMIT);
在下面的情况,需要调用flush()方法:
1.使用触发器
2.混用了Hibernate API和JDBC API
3.JDBC驱动程序不健壮,导致Hibernate在自动清理缓存模式下无法正常工作。
7.3 在Hibernate应用中Java对象的状态
需要被持久化的Java对象,在其生命周期中有三种状态:
1.临时状态:刚用new创建,没被持久化,没在Session缓存中。
2.持久化状态:被持久化,加入到Session缓存中。
3.游离状态:被持久化,没在Session缓存中。
关于状态转换的图表,见书。
7.3.1 临时对象
特征:不在Session缓存中。
在数据库中无相应记录。
如何获得:刚用new创建了一个对象。
用Session的delete()方法。
7.3.2 持久化对象
特征:在一个Session实例的缓存中。
在数据库中有相应记录。
Session清理缓存时,会根据持久化对象的属性变化,来同步更新数据库。
如何获得:用Session的save()方法。
用Session的load()或get()方法。
用Session的find()方法。
用Session的update()、saveOrUpdate()、lock()方法。
允许级联保存时,如果一个持久化对象关联一个临时对象,Session清理缓
存时,会把临时对象转变为持久化对象。
注意:应避免一个Java对象同时被多个Session实例关联。
7.3.3 游离对象
特征:不在Session缓存中。
如果没有其他程序删除其对应的纪录,那么数据库中应该有其纪录。
获得:用Session的close()方法。
用Session的evict()方法,可以从缓存中删除一个持久化对象。
7.4 Session的保存、更新、删除、查询方法
7.4.1 Session的save()方法
完成操作:
1.把要保存的对象加入到缓存中,将其变为持久化对象。
2.选用映射文件指定的标识符生成器为持久化对象分配唯一的OID。(注意,不能修改持久化对象的OID。)
3.执行一个insert语句。(不是立即执行,而是当Session清理缓存时,才会执行。)
注意:不能将持久化对象或游离对象传给save()方法。
7.4.2 Session的update()方法
完成操作:
1.把对象重新加入到Session缓存中,使它变为持久化对象。
2.计划一个update语句,当Session清理缓存时,才会执行。
如果用update关联了一个游离对象,即使这个对象没有被修改,也会生成update语句。要避免这种情况,可以将映射文件中<class>元素的select-before-update=”true”(默认false),这样Session清理缓存时,会先执行一个select语句,将原来的数据调出来对比是否一致,只有改变了才会执行update。这一方法会导致多select语句,所以如果数据不会经常变化的话,再这样设置。
注意:不能关联在Session缓存中存在同样OID的游离对象。
不能关联在数据库中没有相应记录的游离对象。
7.4.3 Session的saveOrUpdate()方法
包含save()和update()方法的功能。遇到临时对象,就调用save;遇到游离对象,调用update();遇到持久化对象,直接返回。
如何判断是临时or游离对象?
满足下面情况之一,就是临时对象:
1.OID取值为null
2.具有version属性,并取值为null
3.映射文件的<id>元素设置了unsaved-valued属性,且OID取值与其属性值相符。例如,unsaved-valued=”0”,那么OID为0时是临时对象。
4. 映射文件的version元素设置了unsaved-valued属性,且version取值与其属性值相符。
5.自定义了Interceptor实现类,且其isUnsaved()方法返回Boolean.TRUE。
7.4.4 Session的load()、get()方法
都根据OID从数据库中加载一个持久化对象。区别:如果不存在于OID对应的纪录,load()抛出异常,get()返回null。
7.4.5 Session的delete()方法
删除数据库中与Java对象对应的记录。
分享到:
相关推荐
**标题:Hibernate 操纵持久化对象** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的交互。本篇将详细讲解如何使用Hibernate来操纵持久化对象,这对于深入理解...
12.3.2 操纵持久化对象 12.4 选择继承关系的映射方式 12.5 映射多对一多态关联 12.6 小结 12.7 思考题 第13章 Java集合类 13.1 Set(集) 13.1.1 Set的一般用法 13.1.2 HashSet类 13.1.3 TreeSet...
12.3.2 操纵持久化对象 12.4 选择继承关系的映射方式 12.5 映射多对一多态关联 12.6 小结 12.7 思考题 第13章 Java集合类 13.1 Set(集) 13.1.1 Set的一般用法 13.1.2 HashSet类 13.1.3 TreeSet...
12.3.2 操纵持久化对象 12.4 选择继承关系的映射方式 12.5 映射多对一多态关联 12.6 小结 12.7 思考题 第13章 Java集合类 13.1 Set(集) 13.1.1 Set的一般用法 13.1.2 HashSet类 13.1.3 TreeSet...
12.3.2 操纵持久化对象 12.4 选择继承关系的映射方式 12.5 映射多对一多态关联 12.6 小结 12.7 思考题 第13章 Java集合类 13.1 Set(集) 13.1.1 Set的一般用法 13.1.2 HashSet类 13.1.3 TreeSet...
7. **操纵持久化对象** - Hibernate提供了CRUD(创建、读取、更新、删除)操作的API,如`save()`, `get()`, `update()`, `delete()`等。 - 还支持事务管理和状态管理,如托管状态和游离状态的转换。 8. **检索...
**二、操纵持久化对象** 1. **Java对象在JVM中的生命周期** - **临时状态**:新建对象未被持久化,不在Session缓存中,数据库无对应记录。 - **持久化状态**:已加入Session缓存,与Session关联,数据库有对应...
本篇文章主要关注如何通过Hibernate的Session接口来操纵对象,实现数据的持久化。 首先,我们需要理解Session在Hibernate中的角色。Session是Hibernate的核心接口之一,它负责对象的持久化操作,比如保存、更新、...
##### 14.1.2 操纵持久化对象 使用表/类映射时,你可以像处理普通对象一样操纵这些持久化对象。Hibernate会负责在对象和数据库表之间进行转换。例如,保存一个`HourlyEmployee`对象: ```java Session session = ...
8.3.2 持久化对象的特征 189 8.3.3 被删除对象的特征 190 8.3.4 游离对象的特征 191 8.4 Session接口的详细用法 191 8.4.1 Session的save()和persist()方法 191 8.4.2 Session的load()和get()方法 194 8.4.3 ...
8.3.2 持久化对象的特征 189 8.3.3 被删除对象的特征 190 8.3.4 游离对象的特征 191 8.4 Session接口的详细用法 191 8.4.1 Session的save()和persist()方法 191 8.4.2 Session的load()和get()方法 194 8.4.3 ...
"操纵持久化对象.ppt"可能涉及如何通过ORM框架,如Hibernate,来创建、读取、更新和删除(CRUD)数据库中的对象。这包括实体类的设计,配置映射文件,以及使用SessionFactory和Session对象进行数据库操作。 5. **...
hibernate入门;java对象持久化;对象-关系映射基础;映射对象标识符;映射一对多关联关系;映射一对一关联关系;...操纵持久化对象;映射组成关系;hibernate映射类型;hibernate的检索策略等等。
操纵持久化对象 698 选择继承关系的映射方式 699 映射多对一多态关联 702 内容总结 705 独立实践 705 第三十六章:HQL介绍 706 学习目标 706 HQL的出现 707 进入HQL世界 707 聚合 708 分组 709 在Java中使用HQL 709 ...
Hibernate3对象关系映射、操纵持久化对象、Hibernate相关映射、Hibernate检索策略、Hibernate检索方式、Hibernate高级配置、Java语言的反射机制、iBATIS原理及使用;Spring2概述、bean和BeanFactory等。 通过上述...
在Java编程中,持久化是将对象的状态保存到持久存储介质(如数据库)中的过程,确保即使程序关闭或系统出现故障,数据也能在后续的运行时恢复。Hibernate作为一款流行的Java对象关系映射(ORM)框架,它简化了Java...
- **操纵持久化对象** - CRUD 操作。 - 查询对象的方法。 - 更新和删除对象。 - **事务控制** - Hibernate 事务管理机制。 - 事务的隔离级别。 - 如何确保数据一致性。 - **高级映射** - 继承映射。 - ...
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。