hibernate的设计者为了更好的维护对象,以便生成恰当的SQL语句,引入了对象的状态这个概念.hibernate文档里面描述hibernate的状态分为三种:
瞬时(Transient),又称临时状态
持久(Persistent)
脱管(Detached)又称游离状态
其实我也觉得如果按照Hibernate的关于对象的状态定义,状态应该分为四种才对:
多了一个删除状态,因为游离状态本身也是有对象引用,只是没有被session管理起来,不会被gc回收.四种对象状态的完整定义:
临时:一般是新new的对象
持久:有OID,对对象的操作都会同步到数据库中
游离:对象有OID,并且与数据中的某条记录对应,修改对象不会同步到数据库
删除:session调用了delete()方法把对象从数据库中删除后状态
对象状态虽然不多,但是在使用中要格外小心,只有持久状态的对象才能同步到数据库中.管理对象状态的常用方法:
save():使临时对象持久对象(把对象交给Session管理)
update():把游离对象变为持久对象(把对象交给Session管理)
saveOrUpdate():把临时对象或游离对象变为持久对象,通过OID判断对象为什么对象
delete():把持久或游离状态变为删除状态(只要是数据库中有记录,就能删除,没有就报错)
get():立即加载,如果指定ID的数据不存在,则返回null
load():延迟加载,但实体类不能是final的,否则延迟加载失效,如果指定id的数据不存在,则抛异常
上面这些方法中需要特意说下的是load()方法.load()方法是基于类的懒加载,也就是class标签的lazy属性,默认值为true.在为true的情况下调用load()方法会返回一个代理类,且是一个没有初始化的代理类,只有当使用这个类的某个方法时才会去真正的加载记录;如果没有在数据库中找到对应的记录,则抛出异常.如果类的修饰符是fianl,由于hibernate是使用的继承创建的代理类,所以在这种情况下就不能创建代理类,将立即加载.
Hibernate中有二级缓存的概念,既然有二级缓存,那也自然就有"一级缓存"了,实际上,一级缓存就是session的缓存,Session 接口是Hibernate向应用程序提供的操纵对数据库的最主要的接口,它提供了基本的保存,更新,删除和加载Java对象的方法.Session接口的实现中包含了一系列的集合,这些集合构成了Session缓存,只要Session实例的生命周期没有结束,存放在它缓存里的对象也不会结束生命周期,因为还有这些集合在引用这些对象.所以如果有对象已经不需要了,就要即时的清除.把对象变为游离状态或者删除状态.
Session提供了一系列对缓存进行操作的方法:
clear():清空Session(把Session的缓存中所有的对象全部清除出去)
evict(Object):把指定的对象从Session缓存中驱逐出去
flush():把Session缓存中的状态马上同步到数据库.默认情况下,生成的update语句、delete语句都是在flush()执行的时候执行,
在事务提交的时候会自动的先flush()一下.但是insert语句在什么时候执行,是跟主键生成策略有关的.如果是由数据库生成主
键,则遇到insert()语句会马上执行,因为需要得到主要值,以便之后使用;如果生成策略是assigned,则会在flush()执行的时候
执行,因为主键值是由你提供的,所以Hibernate不用问数据库也知道.但是调用flush()方法可以让缓存里面的语句马上执行,以同步状态.
refresh(Object):让缓存中的对象与数据库中的数据状态一致.假如我要把一个对象变成持久状态,我先把它从数据库从拿出来(从
数据库中取出就是持久状态),然后把它的数据进行更新,存储到某个地方,如果在更新---存储的过程之间,数据被另一个人修
改了,我存储的时候也无法获取最新的数据,因为Hibernate已经查询过一次,已经有了这个对象的持久状态,它便不会再进行
查询,这个时候如果想要获取最新的数据,就要使用refresh(Object)方法,把想要更新的对象传入进去,Hibernate就会进行再次查询.
分享到:
相关推荐
Hibernate3.6-Final-CHM带搜索API
hibernate3.6 对应的 hibernate-validator-4.1.0
NULL 博文链接:https://zfwdl2005.iteye.com/blog/845050
Hibernate是一个开放源代码的对象关系映射框架(ORM),它对JDBC进行了非常轻量级的对象封装。
Hibernate 3.6 Final所有的jar包,以及Hibernate Tools 中的hibernate-tools.jar 和 freemarker.jar 。 本jar包用于使用hibernate-tools生成POJO所需要的依赖库
添加Hibernate3.6的核心类库,包含:hibernate3.jar、antlr-2.7.6.jar、cglib-nodep-2.1_3.jar、commons-collections-3.1.jar、dom4j-1.6.1.jar、ehcache-1.5.0.jar、hibernate-jpa-2.0-api-1.0.0.Final.jar、...
hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-4.1.12.Final.jar hibernate-jpa-2.0-api-1.0.1.Final.jar ...
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
HibernateTools-3.2.4,Hibernate工具包,开发使用,欢迎下载
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
Hibernate 3.6 src 源代码 hibernate-core-3.6.0.Final.src.tar
hibernate3.6.4.final.CHM hibernate的使用帮助文档
HibernateTools-3.2.4.Beta1-R200810311334.zip
hibernate-distribution-3.6.10.Final
这是开发hibernate框架的framework官方中文文档,可以参照此文档写hibernate的helloworld程序
我见过的最好的最详细的hibernate3.6.X学习资料(汤阳光)