`

操纵持久化对象

阅读更多
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 操纵持久化对象

    **标题:Hibernate 操纵持久化对象** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的交互。本篇将详细讲解如何使用Hibernate来操纵持久化对象,这对于深入理解...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     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...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     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...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     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...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     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...

    hibernate入门与概述

    7. **操纵持久化对象** - Hibernate提供了CRUD(创建、读取、更新、删除)操作的API,如`save()`, `get()`, `update()`, `delete()`等。 - 还支持事务管理和状态管理,如托管状态和游离状态的转换。 8. **检索...

    Hibernate总结

    **二、操纵持久化对象** 1. **Java对象在JVM中的生命周期** - **临时状态**:新建对象未被持久化,不在Session缓存中,数据库无对应记录。 - **持久化状态**:已加入Session缓存,与Session关联,数据库有对应...

    hibernate--3.Hibernate数据持久化(通过 Session 操纵对象)

    本篇文章主要关注如何通过Hibernate的Session接口来操纵对象,实现数据的持久化。 首先,我们需要理解Session在Hibernate中的角色。Session是Hibernate的核心接口之一,它负责对象的持久化操作,比如保存、更新、...

    用Hibernate映射继承关系

    ##### 14.1.2 操纵持久化对象 使用表/类映射时,你可以像处理普通对象一样操纵这些持久化对象。Hibernate会负责在对象和数据库表之间进行转换。例如,保存一个`HourlyEmployee`对象: ```java Session session = ...

    精通Hibernate:对象持久化技术第二版part3

    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 ...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    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 ...

    J2EE初学者ppt课件

    "操纵持久化对象.ppt"可能涉及如何通过ORM框架,如Hibernate,来创建、读取、更新和删除(CRUD)数据库中的对象。这包括实体类的设计,配置映射文件,以及使用SessionFactory和Session对象进行数据库操作。 5. **...

    Hibernate的ppt

    hibernate入门;java对象持久化;对象-关系映射基础;映射对象标识符;映射一对多关联关系;映射一对一关联关系;...操纵持久化对象;映射组成关系;hibernate映射类型;hibernate的检索策略等等。

    Java语言基础下载

    操纵持久化对象 698 选择继承关系的映射方式 699 映射多对一多态关联 702 内容总结 705 独立实践 705 第三十六章:HQL介绍 706 学习目标 706 HQL的出现 707 进入HQL世界 707 聚合 708 分组 709 在Java中使用HQL 709 ...

    JAVA软件工程课程体系

    Hibernate3对象关系映射、操纵持久化对象、Hibernate相关映射、Hibernate检索策略、Hibernate检索方式、Hibernate高级配置、Java语言的反射机制、iBATIS原理及使用;Spring2概述、bean和BeanFactory等。 通过上述...

    hibernate中持久化是什么

    在Java编程中,持久化是将对象的状态保存到持久存储介质(如数据库)中的过程,确保即使程序关闭或系统出现故障,数据也能在后续的运行时恢复。Hibernate作为一款流行的Java对象关系映射(ORM)框架,它简化了Java...

    javaEE学习笔记

    - **操纵持久化对象** - CRUD 操作。 - 查询对象的方法。 - 更新和删除对象。 - **事务控制** - Hibernate 事务管理机制。 - 事务的隔离级别。 - 如何确保数据一致性。 - **高级映射** - 继承映射。 - ...

    Hibernate:java对象持久化技术详解

    Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

Global site tag (gtag.js) - Google Analytics