`
wjt276
  • 浏览: 650509 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

004---持久对象的生命周期介绍(二)

阅读更多

try {

            session = HibernateUtils.getSession();

            session.beginTransaction();

            /*

             * 此时session又对user对象进行管理

             * session发出update指定后,进行更新数据为(张三。)

             */

            session.update(user);

 

            //updateuser对象状态又变为persistent状态

            session.getTransaction().commit();

            /*

             * 此时session提交事务,发出update语句

             * Hibernate: update User set name=?, password=?, createTime=?, expireTime=? where id=?

             */

        } catch (HibernateException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

            session.getTransaction().rollback();

        }finally {

            HibernateUtils.closeSession(session);

        }

    }

 

Hibernate加载数据:

         两种:get()load()

一、 Session.get(Class arg0, Serializable arg1)方法

* arg0:需要加载对象的类,例如:User.class

    * arg1:查询条件(实现了序列化接口的对象)

"4028818a245fdd0301245fdd06380001"字符串已经实现了序列化接口。

    返回值: 此方法返回类型为Object,也就是对象,然后我们再强行转换为需要加载的对象就可以了。

            如果数据不存在,则返回null;

    注:执行此方法时立即发出查询SQL语句。加载User对象

 

加载数据库中存在的数据,代码如下:

try {

            session = sf.openSession();

            session.beginTransaction();

           

            /*

             * Object org.hibernate.Session.get(Class arg0, Serializable arg1) throws HibernateException

             * arg0:需要加载对象的类,例如:User.class

             * arg1:查询条件(实现了序列化接口的对象):例"4028818a245fdd0301245fdd06380001"字符串已经实现了序列化接口。

             * 此方法返回类型为Object,也就是对象,然后我们再强行转换为需要加载的对象就可以了。

                如果数据不存在,则返回null

             * 执行此方法时立即发出查询SQL语句。加载User对象。

             */

            User user = (User)session.get(User.class, "4028818a245fdd0301245fdd06380001");

           

            //数据加载完后的状态为persistent状态。数据将与数据库同步。

            System.out.println("user.name=" + user.getName());

           

            //因为此的userpersistent状态,所以数据库进行同步为龙哥。

            user.setName("龙哥");

           

            session.getTransaction().commit();

        } catch (HibernateException e) {

            e.printStackTrace();

            session.getTransaction().rollback();

        } finally{

            if (session != null){

                if (session.isOpen()){

                    session.close();

                }

            }

 

 

二、 Object Session.load(Class arg0, Serializable arg1) throws HibernateException

    * arg0:需要加载对象的类,例如:User.class

    * arg1:查询条件(实现了序列化接口的对象):例"4028818a245fdd0301245fdd06380001"字符串已经实现了序列化接口。

    * 此方法返回类型为Object,但返回的是代理对象。

    * 执行此方法时不会立即发出查询SQL语句。只有在使用对象时,它才发出查询SQL语句,加载对象。

    * 因为load方法实现了lazy(称为延迟加载、赖加载)

    * 延迟加载:只有真正使用这个对象的时候,才加载(才发出SQL语句)

    * hibernate延迟加载实现原理是代理方式。

    * 采用load()方法加载数据,如果数据库中没有相应的记录,则会抛出异常对象不找到(org.hibernate.ObjectNotFoundException)

    try {

        session = sf.openSession();

        session.beginTransaction();

       

         User user = (User)session.load(User.class, “4028818a245fdd0301245fdd06380001");

           

        //只有在使用对象时,它才发出查询SQL语句,加载对象。

        System.out.println("user.name=" + user.getName());

           

        //因为此的userpersistent状态,所以数据库进行同步为龙哥。

        user.setName("发哥");

           

        session.getTransaction().commit();

    } catch (HibernateException e) {

        e.printStackTrace();

        session.getTransaction().rollback();

    } finally{

            if (session != null){

                if (session.isOpen()){

                    session.close();

                }

            }

    }      

 

Hibernate两种加载数据方式的区别:

    get()方法默认不支持lazy(延迟加载)功能,而load支持延迟加载

    get()方法在查询不到数据时,返回null,load因为支持延迟加载,只有在使用对象时才加载,所以如果数据库中不在数据load会抛出异常(org.hibernate.ObjectNotFoundException)

   

    get()load()只根据主键查询,不能根据其它字段查询,如果想根据非主键查询,可以使用HQL

 

hibernate更新数据:

建立使用hibernate进行更新数据时,先加载数据,然后再修改后更新。

否则一些字段可以会被null替换。

try {

            session = sf.openSession();

            session.beginTransaction();

           

            //手动构造一个Detaded状态的User

            User user = new User();

            user.setId("4028818a245fdd0301245fdd06380001");

            user.setName("wjt276");

            //Transient状态

         /*

          * 目前这样更新,数据库记录中此条记录,除了idname字段为设置字段,其它均为null,因为对象其它

          * 属性没有设置数据,因为更新数据时要先加载需要更新数据的对象,再修改更新。

          */

            session.update(user);//userpersistent状态

           

            session.getTransaction().commit();

        } catch (HibernateException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

            session.getTransaction().rollback();

        } finally{

            if (session != null){

                if (session.isOpen()){

                    session.close();

                }

            }

        }

 

 

 

 

分享到:
评论

相关推荐

    Hibernate对象的生命周期

    Hibernate对象的生命周期 Hibernate对象的生命周期 Hibernate对象的生命周期

    Hibernate持久化对象的生命周期

    Hibernate的核心概念之一就是持久化对象的生命周期,这涉及到对象在数据库中的状态及其与Session的关系。 首先,我们来看一下Hibernate中持久化对象的三种基本状态: 1. **瞬时对象(Transient Objects)**: - ...

    hibernate持久化对象生命周期[参照].pdf

    本文将深入探讨Hibernate中的持久化对象生命周期,包括瞬时对象、持久化对象和游离对象的状态转换及其特性。 1. 瞬时对象(Transient Objects) 瞬时对象是指通过`new`操作符创建但尚未与数据库记录关联的Java对象...

    08 领域对象的生命周期 102-116.rar

    3. **持久化框架**:在实际应用中,领域对象的生命周期往往与数据存储紧密相关。ORM(对象关系映射)框架如 Hibernate 或 Entity Framework 可以帮助我们将领域对象与数据库中的记录进行绑定,从而实现对象的持久化...

    08 领域对象的生命周期 87-101.rar

    综上所述,领域对象的生命周期管理是软件开发中至关重要的一部分,它涉及到对象的创建、使用、状态管理、持久化、查询和销毁等多个环节。理解和掌握这些知识点对于构建高效、稳定且符合业务需求的系统至关重要。在...

    测试实体对象的生命周期

    在IT行业中,尤其是在Java开发领域,实体对象的生命周期管理是至关重要的一个环节,尤其是在使用ORM(Object-Relational Mapping)框架如Hibernate时。本文将详细探讨“测试实体对象的生命周期”,并结合给定的标签...

    T21.4_持久化对象生命周期 java 经典教程 经典教材

    T21.4_持久化对象生命周期 java 经典教程 经典教材

    hibernate的生命周期

    在Hibernate中,每个持久化对象都有一个生命周期,理解这些生命周期状态对于优化性能和正确管理数据库记录至关重要。 **一、持久化对象的状态** 1. **瞬时态(Transient)**:对象刚刚被创建,尚未与Session关联,...

    hibernate5--2.数据持久化及事务

    通过Session的save()或persist()方法,我们可以将瞬时对象转换为持久对象,确保其状态被持久化到数据库。 **持久化对象的生命周期:** - **瞬时态(Transient)**:对象刚刚创建,尚未与Session关联,此时对象状态...

    深入理解持久化对象

    持久化对象是Hibernate框架的核心概念之一,通过合理的状态管理和生命周期控制,可以极大地提高应用程序的开发效率和维护性。理解和掌握持久化对象的状态转换及修改方法,对于高效使用Hibernate框架至关重要。

    JPA学习笔记-EJB-05JPA实体对象状态和实体对象的高级操作

    实体监听器是一种特殊的类,它可以监听实体对象生命周期中的某些事件,如插入、更新或删除等,并在这些事件发生前后执行特定的操作。实体监听器主要用于日志记录、数据验证等场景。 1. **实体监听器注解** 实体...

    Activity生命周期详解

    ### Activity生命周期详解 #### 概述 Android应用开发中,`Activity`是四大基础组件之一,主要用于构建用户界面。理解`Activity`的生命周期对于管理应用的状态、资源以及响应用户交互至关重要。 #### `Activity`...

    hibernate3.2生命周期

    总结,理解Hibernate3.2中的对象生命周期是有效使用Hibernate的关键。正确管理对象状态,能够避免数据丢失,提高应用程序性能,并减少潜在的并发问题。深入源码和使用专业工具能进一步提升开发效率。

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

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    hibernate session生命周期示例

    本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个强大的工具。 Hibernate Session是Hibernate的核心接口,它是与数据库交互的主要接口。Session对象负责管理实体对象的状态,包括...

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

    本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、删除状态和游离状态。处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 ...

    hibernate核心API

    本文将详细介绍Hibernate中持久化对象的三种生命周期状态:瞬态、持久和脱管,并解释每种状态的特点以及如何在这些状态之间进行转换。 #### 二、持久化生命周期概述 Hibernate的核心设计理念之一就是对象状态管理,...

    java-hibernate持久化

    "java-hibernate持久化"这个主题主要关注如何使用Hibernate来管理对象的生命周期和状态,以及其内部的一级缓存机制。 首先,我们讨论Hibernate中的持久化对象状态。这些状态定义了对象与Hibernate Session的关系,...

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

    本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、删除状态和游离状态。处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 ...

    hibernate:java持久化对象详解01

    - Session:它是Hibernate的核心接口,负责管理对象的生命周期,包括创建、加载、更新和删除对象。 - Transaction:在Hibernate中,事务是数据库操作的基本单元,用于确保数据的一致性和完整性。 - Entity:持久...

Global site tag (gtag.js) - Google Analytics