`
dengyll
  • 浏览: 93749 次
社区版块
存档分类
最新评论

一点点学习Hibernate3.6 -对象的状态

阅读更多

  • 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就会进行再次查询. 

  • 2
    0
    分享到:
    评论

    相关推荐

      Hibernate3.6-Final CHM-API

      Hibernate3.6-Final-CHM带搜索API

      hibernate3.6-jar包

      【hibernate3.6-jar包】是一个与Java编程相关的资源,主要涉及ORM(对象关系映射)框架Hibernate的3.6版本。Hibernate是一个开源的库,它允许开发人员在Java应用程序中使用面向对象的方式来操作数据库,从而避免了...

      hibernate3.6 对应的 hibernate-validator-4.1.0

      hibernate3.6 对应的 hibernate-validator-4.1.0

      Hibernate3.6

      总结起来,Hibernate 3.6 作为一款成熟的 ORM 框架,通过对象化的数据库操作方式,极大地提升了 Java 应用的开发效率,同时也提供了丰富的功能和优化选项,帮助开发者更好地应对复杂的数据访问需求。

      hibernate 3.6 中文 chm

      《Hibernate 3.6 中文 CHM》是一个针对Hibernate 3.6版本的详细使用指南,旨在帮助开发者理解和掌握这个强大的对象关系映射(ORM)框架。Hibernate是Java开发中的一个重要工具,它允许程序员以面向对象的方式处理...

      hibernate3.6.jar

      3. **Criteria 查询**:除了传统的HQL(Hibernate Query Language)查询,Hibernate 3.6也支持Criteria查询,这是一种更加面向对象的查询方式。Criteria API允许动态构建查询,无需编写SQL字符串,提高了代码的...

      Hibernate3.6 Final &Hibernate tools

      Hibernate 3.6 Final所有的jar包,以及Hibernate Tools 中的hibernate-tools.jar 和 freemarker.jar 。 本jar包用于使用hibernate-tools生成POJO所需要的依赖库

      hibernate3.6

      Hibernate 3.6 是一个流行的Java对象关系映射(ORM)框架的重要版本,它极大地简化了数据库操作,将复杂的SQL语句与Java对象之间建立了桥梁。在这个版本中,Hibernate提供了许多增强的功能和优化,旨在提高开发效率...

      汤阳光Hibernate3.6(基础).doc

      【标题】:“汤阳光Hibernate3.6(基础).doc”文档详细介绍了Hibernate 3.6,这是一份适合Hibernate初学者的学习资料,涵盖了丰富的实例代码、图表和注解。 【描述】:文档主要讨论了Java对象持久化,特别是如何在...

      hibernate3.6框架中文文档

      接下来,我们将深入学习如何使用Hibernate 3.6进行开发: 1. **环境搭建**: 首先,你需要在项目中引入Hibernate的JAR包,以及相应的数据库驱动。然后,配置hibernate.cfg.xml文件,确保数据库连接正确。 2. **创建...

      easybeans-persistence-hibernate-3.6-1.0.1-sources.jar

      jar包,官方版本,自测可用

      easybeans-persistence-hibernate-3.6-1.0.0-sources.jar

      jar包,官方版本,自测可用

      hibernate-configuration-3.0.dtd、hibernate-mapping-3.0.dtd

      此外,`hibernate-mapping-3.0.dtd`还支持更复杂的映射,如一对一、一对多、多对多的关系映射,以及自定义类型、延迟加载等特性。 在实际应用中,`hibernate.properties`文件是Hibernate 5.0.7版本的配置文件,主要...

      easybeans-persistence-hibernate-3.6-1.0.1.jar

      jar包,官方版本,自测可用

      easybeans-persistence-hibernate-3.6-1.0.0.jar

      jar包,官方版本,自测可用

      DmDialect-for-hibernate1-5.zip

      达梦数据DmDialect-for-hibernate所有jar包,DmDialect-for-hibernate2.0、DmDialect-for-hibernate2.1、DmDialect-for-hibernate3.0、DmDialect-for-hibernate3.1、DmDialect-for-hibernate3.6、DmDialect-for-...

      ssh(struts2.2.1+_hibernate3.6+spring3.0.5)整合配置

      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参考文档中英文

      标题"hibernate3.6参考文档中英文"表明这是一个关于Hibernate 3.6版本的综合参考资料,包含中文和英文两个版本。Hibernate是一个流行的Java ORM(对象关系映射)框架,它使得Java开发者可以更加便捷地在数据库上操作...

      hibernate3.6所有包

      Hibernate是Java领域中一款著名的对象关系...不过,随着技术的发展,现在已经有更先进的Hibernate版本(如5.x),以及Spring Data JPA等更高级的抽象,但在学习和理解ORM概念时,Hibernate 3.6仍是一个有价值的起点。

      我见过的最好的最详细的hibernate3.6.X学习资料(汤阳光)

      【hibernate3.6.X】是一个流行的Java持久化框架,它实现了ORM(对象关系映射)技术,使得开发者可以通过面向对象的方式处理数据库操作,从而降低了数据库编程的复杂性。在传统的三层架构中,hibernate常被用作数据...

    Global site tag (gtag.js) - Google Analytics