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-jar包】是一个与Java编程相关的资源,主要涉及ORM(对象关系映射)框架Hibernate的3.6版本。Hibernate是一个开源的库,它允许开发人员在Java应用程序中使用面向对象的方式来操作数据库,从而避免了...
hibernate3.6 对应的 hibernate-validator-4.1.0
总结起来,Hibernate 3.6 作为一款成熟的 ORM 框架,通过对象化的数据库操作方式,极大地提升了 Java 应用的开发效率,同时也提供了丰富的功能和优化选项,帮助开发者更好地应对复杂的数据访问需求。
《Hibernate 3.6 中文 CHM》是一个针对Hibernate 3.6版本的详细使用指南,旨在帮助开发者理解和掌握这个强大的对象关系映射(ORM)框架。Hibernate是Java开发中的一个重要工具,它允许程序员以面向对象的方式处理...
3. **Criteria 查询**:除了传统的HQL(Hibernate Query Language)查询,Hibernate 3.6也支持Criteria查询,这是一种更加面向对象的查询方式。Criteria API允许动态构建查询,无需编写SQL字符串,提高了代码的...
Hibernate 3.6 Final所有的jar包,以及Hibernate Tools 中的hibernate-tools.jar 和 freemarker.jar 。 本jar包用于使用hibernate-tools生成POJO所需要的依赖库
Hibernate 3.6 是一个流行的Java对象关系映射(ORM)框架的重要版本,它极大地简化了数据库操作,将复杂的SQL语句与Java对象之间建立了桥梁。在这个版本中,Hibernate提供了许多增强的功能和优化,旨在提高开发效率...
接下来,我们将深入学习如何使用Hibernate 3.6进行开发: 1. **环境搭建**: 首先,你需要在项目中引入Hibernate的JAR包,以及相应的数据库驱动。然后,配置hibernate.cfg.xml文件,确保数据库连接正确。 2. **创建...
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
此外,`hibernate-mapping-3.0.dtd`还支持更复杂的映射,如一对一、一对多、多对多的关系映射,以及自定义类型、延迟加载等特性。 在实际应用中,`hibernate.properties`文件是Hibernate 5.0.7版本的配置文件,主要...
2. Hibernate的hibernate-distribution-3.6.0.Final-dist.zip 3. Spring的spring-framework-3.0.5.RELEASE.zip 4. 可选的spring-framework-2.5.6-with-dependencies.zip,以便获取旧版本的Spring依赖 5. SLF4J的slf4...
标题"hibernate3.6参考文档中英文"表明这是一个关于Hibernate 3.6版本的综合参考资料,包含中文和英文两个版本。Hibernate是一个流行的Java ORM(对象关系映射)框架,它使得Java开发者可以更加便捷地在数据库上操作...
Hibernate是Java领域中一款著名的对象关系...不过,随着技术的发展,现在已经有更先进的Hibernate版本(如5.x),以及Spring Data JPA等更高级的抽象,但在学习和理解ORM概念时,Hibernate 3.6仍是一个有价值的起点。
【hibernate3.6.X】是一个流行的Java持久化框架,它实现了ORM(对象关系映射)技术,使得开发者可以通过面向对象的方式处理数据库操作,从而降低了数据库编程的复杂性。在传统的三层架构中,hibernate常被用作数据...
4. **hibernate-validator.jar**:提供了Hibernate的验证功能,遵循JSR-303/JSR-349规范,用于校验对象属性。 5. **jta.jar**:Java Transaction API,用于支持分布式事务处理。 6. **jboss-logging.jar**:日志...