- 浏览: 284087 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
u011563440:
u011563440 写道用反射A.class.toGener ...
Java接口中的内部接口和接口中的内部类 -
u011563440:
用反射A.class.toGenericString()--- ...
Java接口中的内部接口和接口中的内部类 -
narutolby:
因为接口本身不能实例化,所以在new 一个 接口的内部类时默认 ...
Java接口中的内部接口和接口中的内部类 -
hekuilove:
请问楼主,第四部如何做?在eclipse哪个位置?
eclipse中使用maven插件的问题:Updating index central|http://repo1.maven.org/maven2 -
小小生:
请问下,如果修改了数据库里面的订单任务的时间,那么不是要重启? ...
利用Spring动态对Quartz定时任务管理
要在应用中使用Hibernate,首先要初始化Hibernate的运行环境,使持久化类和数据库受控于Hibernate,才能使用Hibernate提供的接口实现对象和数据库的互操作。由于Hibernate在内部封装了Hibernate环境的初始化过程,因此只要在应用程序中简单的使用配置文件初始化就可以了。通常情况下,Hibernate应用的启动和处理过程是统一的,这个过程可以用图3-4来描述。
图1 Hibernate应用启动和处理序列图
图1展示的是Hibernate初始化应用环境,执行数据操作的一般过程。在这个过程中,Hibernate封装了初始化的细节问题,为了更好的理解Hibernate的运行机制,必须对Hibernate的使用过程做出分析。
首先,应用通过实例化Configuration对象初始化应用环境。该对象读取配置文件和映射文件信息,并解析这些文件,然后根据配置文件和映射文件的定义,设置应用的环境。在解析过程中:
Configuration对象根据配置文件的设置,读取属性配置信息,比如:JDBC连接属性、方言属性等。然后检查属性配置并把配置信息放入应用环境中。系统默认的配置文件路径是应用程序的classpath,当然也可以指定配置文件路径,不过这需要使用Configuration对象的configure()方法指定配置文件。
Configuration对象根据配置文件的信息,按照映射文件、类缓存、集合缓存、监听器、事件的顺序依次读取并解析。如果是映射文件,则根据配置的路径解析映射文件,实现持久化类到数据表的映射配置。如果是缓存配置,则根据缓存配置策略设置类或集合的缓存特性。
构建SessionFactory。通过调用Configuration对象的buildSessionFactory()方法,可以获取一个SessionFactory对象实现。buildSessionFactory()方法根据以上两步的配置,验证配置属性和映射属性,返回SessionFactoryImpl对象实例。SessionFactoryImpl是SessionFactory的一个实现。
图1中的1.1、1.2两个消息体现了Configuration对象的实例化过程。
接下来,通过Configuration对象获取SessionFactory的实现,并通过SessionFactory的实现获取Session对象,完成数据操作任务,过程如下:
根据Configuration对象获取SessionFactory对象。SessionFactory根据Configuration对象获取的配置信息和映射信息,完成应用的元数据配置。SessionFactory根据属性配置对关系数据库进行设置,以便Hibernate管理。比如:如果设置了属性hbm2ddl.auto的值为create,那么,Hibernate将自动根据映射文件生成数据库模式并导入到数据库中。该步骤对应于图1的消息1.3。在运行期间,SessionFactory是元数据的缓存且不允许修改。
获取Session对象。SessionFactory是Session的工厂。通过调用SessionFactory实例的openSession()方法可以获取SessionImpl对象。SessionImpl是Session接口的实现。即:openSession()方法使用SessionFactory的中的元数据信息和JDBC连接等初始化Session对象。此步骤对应于图1的消息1.4。
启动事务。使用Session对象实现数据的操作时,这些操作单元需要放置于事务范围中。Hibernate对数据库事务进行了封装,实现了统一的事务处理方式,具体可以通过Session对象的beginTransaction()方法,开始一个事务。Session对象的beginTransaction()方法将事务的创建和启动合二为一,简化了用户的操作。JDBCContext使用应用程序的配置信息从事务工厂中创建Hibernate事务,并通过Session对象的beginTransaction()方法提供给客户。事务的获取过程对应于图1的消息1.5。
提交事务。数据操作完成后,需要提交事务,确认对数据库的操作。如果事务没有提交,那么在该事务范围内的数据操作不会对数据库造成影响。在Hibernate中,事务的提交只需要调用刚刚获取的Hibernate事务对象的commit()方法即可。底层事务的提交操作细节由Hibernate的事务对象负责完成。事务的提交对应与图1的消息1.6。
关闭应用。在完成业务逻辑的处理后,关闭系统时,需要清理Hibernate应用环境,释放Hibernate占用的资源。首先通过Session对象的close()方法关闭Session对象,释放数据库连接,清除session中的对象。然后通过SessionFactory对象的close()方法关闭SessionFactory对象,释放所有的数据库连接,清理缓存中的对象并关闭缓存,如果配置文件中hbm2ddl.auto属性的值是drop或create-drop,Hibernate将删除对应的数据库模式。Session对象和SessionFactory对象的关闭过程对应于图1的消息1.7和1.8。
Hibernate中对象的状态
应用程序运行过程中,系统使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象。这些对象可能是刚刚产生准备存储的,也可能是从数据库中获取的。为了区分这些对象,根据对象和当前会话的关联状态,可以分为三种情况。
瞬间对象(Transient Object):使用new操作符初始化的对象不是立刻就持久的。它们的状体啊是瞬时的,也就是说它们没有任何的数据库记录与之对应,只要应用不在引用给对象,它将失去状态,并最终被垃圾回收机制回收。它的特征是:数据库中没有与之对应的记录,而且没有纳入session的管理
例:
Test test = new Test();
test.setName("name1");
持久化对象(Persist Object):持久实例是任何具有数据库标识实际。它有持久化管理器Session的统一管理,持久实例是在事务中进行操作的—它们色状态在事务结束是同数据库同步 。当事务提交时,通过执行SQL语句把内存中的状态同步到数据库中。它的特征是:数据库中有与之对应的记录,而且其纳入了session的管理,并且在处理脏数据的时候与数据库同步。
例:
Transaction tr = session.beginTransaction();
session.save(test);
//此时的test对象已经处于Persistent(持久状态)它被Hibernate纳入实体管理容器
tr.commit();
Transaction tr2 = session.beginTransaction();
test.setName("xukai");
//在这个事务中我们并没有显示的调用save()方法但是由于Persistent状态的对象将会自动的固化到
//数据库中,因此此时正处在Persistent状态的test对象的变化也将自动被同步到数据库中
tr2.commit();
离线对象(Datached Object):Session对象关闭之后,持久化对象就变成离线对象。离线表示这个对象不能在与数据库保持同步,他们不在受Hibernate管理。它的特征是:数据库中有与之对应的记录,但是其自身不纳入session的管理,而且不会和数据库同步。
例:
session.close();
//与test对象关联的session被关闭,因此此时的test对象进入Detached(游离状态)
session2 = HibernateSessionFactory.getSession();
Transaction tr3 = session2.beginTransaction();
session2.update(test);
//此时正处于Detached状态的test对象由于再次借助与session2被纳入到Hibernate的实体管理容器所以此时的
//test对象恢复到Persistent状态
test.setName("jjjj");
tr3.commit();
session2.close();
既然Transient状态的实体与Detached状态的实体都与Hibernate的实体管理容器没有关系,那他们到底存在哪些差异?
差异就在于处于Transient状态的只有一个Name的属性.此时的test对象所包含的数据信息仅限于此,他与数据库中的记录没有任何瓜葛.但是处于Detached状态的实体已经不止包含Name这个属性,还被赋予了主键也就是通常POJO里的id属性,由于id是主键,他可以确定数据库表中的一条唯一的记录,那么自然的处于Detached状态的实体就能与数据库表中拥有相同id的记录相关联.这就是他们之间所存在的差异,简而言之,Transient状态的实体缺乏与数据库表记录之间的联系,而Detached状态的试题恰恰相反.只不过是脱离了session这个数据库操作平台而已.
Hibernate session中常用的操作:
Hibernate session中常用的保存操作只有:save, update, saveOrUpdate,delete;还有其他很多操作没有用过:persist(), merge(), lock(), refresh(), evict(), replicate() ,有必要弄清楚这些方法分别是做什么, 实体对象的状态会发生什么变化?
先看看这些方法中,从javadoc的注释可以得出:
临时 —> 持久
save,persist,saveOrUpdate
托管 —> 持久
update,saveOrUpdate,saveOrUpdateCopy , merge,lock,replicate,refresh
持久 —> 托管
evict
持久 —> 临时
delete
根据以上,可以看出托管->持久的方法是最多的。
那么以上各类情况下,各个方法有什么区别?应该怎样取舍?在hibernate3.2环境下,我得出以下结论:
1. save和perisit
几乎一样,都是持久化一个临时对象;
只是persist持久化的时间可能推迟到flunsh之前,而且perisit传入的对象为托管对象时,会报错,而save托管对象不会报错只是将id置null。
可以看出,在持久化一个临时对象时,只用save就行了。
2. saveOrUpdate和merge
saveOrUpdate将unsaved对象持久化或托管对象持久化;
merge,从名字也能猜到是合并,跟saveOrUpdate相似,可以持久化托管和临时对象。
不同的是:在更新时候,merge将托管对象的属性复制到session中有相同标识符(但不相等)的持久对象(如果不存在,就从db load),也就是先select 后 update;倘若找不到相同标识符的对象,则置id为null,保存临时对象。返回的是持久对象,但是merge传入的对象还是托管的。
可以看出,只有在session中已经存在一个具有相同标识符的持久对象的时候,应该采用merge,此时用saveOrUpdate会报错。当然如果碰到这类情形,将对象属性copy到已经持久化的那个相同标识符对象上也是可以的,正因为如此我一般都没用过merge。再者merge在session中不存在相同标识对象时,会多一条select,往往我们并不需要。
3. merge和replicate
replicate,通过复制来持久化当前已经脱离session的托管对象,这点上看有点像merge,但是当传入一个临时对象则会报错,而且replicate后的传入的那个对象将是持久的,这也是跟merge不同。
通过参数ReplicationMode可以控制遇到相同记录时的行为。
如果是 ReplicationMode.EXCEPTION,则在复制时如果有重复的行数据,则抛出异常。ReplicationMode.IGNORE则忽略 异常。
ReplicationMode.OVERWRITE则会覆盖掉已有行数据。ReplicationMode.LATEST_VERSION则是在有重复时使用最新的版本进行控制。
可以看出,replicate在执行复制的时候,比起merge还是有更多可控行为,ReplicationMode.LATEST_VERSION还可以保证并发修改时只更新最新的版本。
4. lock和refresh
相类似的,都将托管对象又重新持久化,而且可以指定查询时候的锁:
* 当用户显式的使用数据库支持的SQL格式SELECT ... FOR UPDATE 发送SQL的时候,锁定级别设置为LockMode.UPGRADE
* 当用户显式的使用Oracle数据库的SQL语句SELECT ... FOR UPDATE NOWAIT 的时候,锁定级别设置LockMode.UPGRADE_NOWAIT
*当Hibernate在“可重复读”或者是“序列化”数据库隔离级别下读取数据的时候,锁定模式 自动设置为LockMode.READ。这种模式也可以通过用户显式指定进行设置。
*LockMode.NONE 代表无需锁定。在Transaction结束时, 所有的对象都切换到该模式上来。与session相关联的对象通过调用update() 或者saveOrUpdate()脱离该模式。
以上只有 LockMode.NONE,先从缓存查找持久对象;其他的都直接从数据库查找。
有些不同的是,lock还有检查对象版本的能力,如果指定的锁定模式是READ, UPGRADE 或 UPGRADE_NOWAIT,那么Session.lock()就 执行版本号检查。
refresh提供了比load更方便的查找能力,一个刚脱离了session的持久对象,如果用load还需要用id查找,那么refresh就可以直接传入托管对象刷新其状态了。
5. delete和evict
evict,从session的缓存中去除当前实例。执行后对象的改变将不再和数据库保持同步。当指定级联风格为'evict’时,会级联操作关联对象。在用于批量操作的时候,清空缓存,防止内存紧张。
delete,也会从session的缓存中去除当前实例,但flunsh时会执行数据库delete,之后对象就成了临时状态。
可以看出delete比起evict,不仅从session删除,还会从数据库删除。
发表评论
-
Hibernate最佳实践
2013-03-29 11:43 1411基本使用方法 一、导入相应的包 1、hiberna ... -
hibernate 的 CascadeType 属性
2013-03-27 15:00 1485@Entity @Table(name="or ... -
Hibernate 面试中最常考察的知识点整合
2013-03-26 17:31 1119转:http://jianfulove.iteye.com ... -
HiberNate学习-4 映射关系
2013-03-08 15:57 01 hibernate多对多关联映射(双向User<- ... -
HiberNate学习-4 映射关系-多对多
2013-03-08 15:59 8831 hibernate多对多关联映射(双向User< ... -
HiberNate学习-5 总结
2013-03-08 16:00 11211.Hibernate的lazy策略 hibernate ... -
HiberNate学习-5 总结
2013-03-08 15:53 01.Hibernate的lazy策略 hibernate ... -
HiberNate学习-4 映射关系
2013-03-08 15:51 01 hibernate多对多关联映射(双向User<- ... -
HiberNate学习-4 映射关系
2013-03-08 15:50 01 hibernate多对多关联映射(双向User< ... -
HiberNate学习-3 映射关系
2013-03-08 15:46 8481 Hibernate的一对多关联 ... -
HiberNate学习-2映射关系
2013-03-08 15:46 01.Hibernate的一对一主键关联映射 默认 ... -
HiberNate学习-2映射关系
2013-03-08 15:40 9751.Hibernate的一对一主键关联映射 默认c ... -
HiberNate学习-2映射关系
2013-03-08 15:40 01.Hibernate的一对一主键关联映射 默认c ... -
HiberNate学习-1入门
2013-03-08 15:34 991一、Hibernate必须包(3.2)hibernate3. ... -
双向关联
2010-07-22 16:59 1158One-To-One @En ... -
Spring+JPA工程
2010-05-20 14:32 1804JPA需要的jarhibernate-distribution ... -
Hibernate 3新特性介绍及发展趋势
2010-05-20 14:12 1340Hibernate是一种强大的可 ... -
Hibernate3 新特性
2010-05-20 14:11 2091Hibernate3主要的新特性包括: 1:实现了EJB3风 ... -
Hibernate延迟加载机制
2010-05-20 14:05 937该贴转自http://blog.163.com ... -
Hibernate Annotation语法
2010-05-20 14:01 1159CascadeType: CascadeType.PERSI ...
相关推荐
Hibernate对象的生命周期 Hibernate对象的生命周期 Hibernate对象的生命周期
**hibernate的生命周期** Hibernate 是一款强大的Java对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据库事务。在Hibernate中,每个持久化对象都有一个生命周期,...
本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个强大的工具。 Hibernate Session是Hibernate的核心接口,它是与数据库交互的主要接口。Session对象负责管理实体对象的状态,包括...
Hibernate的核心概念之一就是持久化对象的生命周期,这涉及到对象在数据库中的状态及其与Session的关系。 首先,我们来看一下Hibernate中持久化对象的三种基本状态: 1. **瞬时对象(Transient Objects)**: - ...
**hibernate3.2生命周期详解** Hibernate是一个强大的Java对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式处理数据。在Hibernate3.2版本中,实体对象经历了一系列的状态转换,这些...
`hibernate生命周期.jpg` 可能详细介绍了Hibernate实体在应用程序中的生命周期,包括瞬时态、持久态、托管态、脱管态和临时态。这些状态反映了对象与数据库的关联状态,理解它们对于管理对象的生命周期至关重要。 *...
#### 四、Hibernate生命周期状态 - **瞬时态(Transient)**: 实体对象未被持久化,尚未保存到数据库。 - **持久态(Persistent)**: 实体对象已与Session绑定,且已被保存到数据库。 - **游离态(Detached)**: ...
#### 三、Hibernate 生命周期管理 ##### 3.1 对象状态 在 Hibernate 中,对象有三种状态:瞬时态、持久态和脱管态。 - **瞬时态**: 对象尚未被 Session 管理,没有对应的数据库记录。 - **持久态**: Session 已经...
最后,`buildSessionFactory()` 方法生成 `SessionFactory`,它是整个 Hibernate 生命周期的核心。 6. **两个配置文件的作用**:通常,我们只需要 `hibernate.cfg.xml` 文件,但有时在 `hibernate.properties` 中...
4. Hibernate 生命周期: Hibernate 管理的对象有瞬时态(Transient)、持久态(Persistent)、托管态(Managed)和游离态(Detached)。了解这些状态及其转换对于理解 Hibernate 的工作原理至关重要。 5. CRUD ...
SessionFactory 是持久化操作的核心组件,它在整个 Hibernate 生命周期中保持不变,负责生成 Session。而 Session 是短暂的,每个数据库交互应在一个新的 Session 中进行。Session 提供了持久化上下文,它包含了所有...
Hibernate生命周期** - **瞬时状态(Transient)**: 新创建的对象,未与Session关联,对象的改变不会同步到数据库。 - **持久化状态(Persistent)**: 通过Session的save()或persist()方法,对象进入持久化状态,...
本文将深入探讨Hibernate中的持久化对象生命周期,包括瞬时对象、持久化对象和游离对象的状态转换及其特性。 1. 瞬时对象(Transient Objects) 瞬时对象是指通过`new`操作符创建但尚未与数据库记录关联的Java对象...
1. **Hibernate生命周期**:Hibernate操作数据库的过程包括以下步骤: - 配置:加载配置文件并创建SessionFactory。 - 打开Session:通过SessionFactory创建Session。 - 开启Transaction:在Session中开启一个新...
在IT行业中,尤其是在Java开发领域,实体对象的生命周期管理是至关重要的一个环节,尤其是在使用ORM(Object-Relational Mapping)框架如Hibernate时。本文将详细探讨“测试实体对象的生命周期”,并结合给定的标签...
1. **持久化对象的生命周期**:在Hibernate中,对象经历了临时态、持久态和游离态三个状态。临时态的对象没有与Session关联,数据未保存到数据库;持久态对象已与Session绑定,其状态会随Session的提交而保存到...
9. **实体生命周期**:Hibernate管理对象的生命周期,包括瞬时态、持久态、托管态和游离态。理解这些状态转换有助于避免编程陷阱。 10. **一对多、多对一、一对一和多对多关系映射**:Hibernate支持多种关联映射,...
- **生命周期集成**: 理解如何将业务逻辑融入到持久化生命周期中。 - **注解映射**: 学会使用 Java 注解来进行实体类与数据库表的映射。 - **查询与搜索**: 熟悉新版本 Hibernate 中的查询语言和搜索功能。 - **...
8. **实体生命周期**:Hibernate管理实体的生命周期,包括瞬时态、持久态、托管态和脱管态,以及相应的转换过程。 9. **DAO(Data Access Object)模式**:在实际应用中,通常会结合DAO模式使用Hibernate,创建专门...