`

Hibernate Session的update()方法

 
阅读更多

使一个游离对象转变为持久化对象。例如以下代码在session1中保存了一个Customer对象,然后在session2中更新这个Customer对象:

        Customer customer = new Customer();

        customer.setName("Tom");
        Session session1 = sessionFactory.buildSession();
        Transaction tx1 = session.beginTransaction();
        session1.save(customer);
        tx1.commit();
        session1.close();
 
        Session session2 = sessionFactory.openSession();
        Transaction tx2 = session2.beginTransaction();
        customer.setName("Linda"); // 在和session2关联之前修改Customer对象的属性
        session2.update(customer);
       customer2.setName("Jack"); // 在和session2关联之后修改Customer对象的属性
        tx2.commit();
        session2.close();
 

    Session的update()方法完成以下操作:

     (1)把Customer对象重新加入到Session的缓存中,使它变为持久化对象。

     (2)计划执行一个update语句。值得注意的是,Session只有在清理缓存的时候才会执行update语句,并且在执行时才会把Customer对象当前的属性值组装到update语句中。因此,即使程序中多次修改了Customer对象的属性,在清理缓存时只会执行一次update语句。以下两段代码是等价的,无论是左边的代码,还是右边的代码,Session都只会执行一条update语句:

 

 ......

Session session2 = sessionFactory.openSession();

Transaction tx2 = session2.beginTransaction();

customer2.setName("Linda");

session.update(customer);

customer.setName("Jack");

tx2.commit();

session2.close();

 ......

Session session2 = sessionFactory.openSession();

Transaction tx2 = session1.beginTransaction();

session2.update(customer);

customer.setName("Linda");

customer.setName("Jack");

txt2.commit();

session2.close();

 

    以上代码尽管把Customer对象的name属性修改了两次,但Session在清理缓存时,根据Customer对象的当前属性值来组装update语句,因此执行的update语句为:

        update CUSTOMERS set name='Jack' ...... where ID=1;

    只要通过update()方法使游离对象被一个Session关联,即使没有修改Customer对象的任何属性,Session在清理缓存时也会执行由update()方法计划的update语句。例如以下程序使Customer对象被session2关联,但是没有修改Customer对象的任何属性:

        // 此处省略session1持久化Customer对象的代码

        Session session2 = sessionFactory.openSession();

        Transaction tx2 = session2.beginTransaction();

        session.update(customer);

        txt2.commit();

        session2.close();

    Session在清理存缓时,会执行由update()方法计划的update语句,并且根据Customer对象的当前属性来组装update语句:

        update CUSTOMERS set name='Tom' ...... where ID=1;

    如果希望Session仅仅当修改了Customer对象的属性时,才执行update语句,可以把映射文件中<class>元素的select-before-update设为true,该属性默认值为false:

        <class name="Customer" table="CUSTOMERS" selecet-before-update="true">

    如果按以上方式修改了Customer.hbm.xml文件,当Session清理缓存时,会先执行一条select语句:

        select * from CUSTOMERS where ID=1;

    然后比较Customer对象的属性是否和从数据库中检索出来的记录一致,只有在不一致的情况下,才执行update语句。

    应用根据实际情况来决定是否应该把select-before-update设为true。如果Java对象的属性不会经常变化,可以把select-before-update属性设为true,避免Session执行不必要的update语句,这样会提高应用程序的性能。如果需要经常修改Java对象的属性,就没必要把这个属性设为true,因为它会导致在执行update语句之前,执行一条多余的select语句。

    当update()方法关联一个游离对象时,如果在Session的缓存中已经存在相同OID的持久化对象,会抛出异常。例如以下代码通过session2加载了OID为1的Customer对象,接下来又试图把一个OID为1的Customer游离对象加入到session2的缓存中:

         // 此处省略session1持久化Customer对象的代码

         ......

         Session session2 = sessionFactory.openSession();

         Transaction tx2 = session2.beginTransaction();

         // session2加载一个OID为1的Customer持久化对象

         Customer anotherCustomer = (Customer)session2.load(Customer.class, new Long(1));

         // 把一个OID为1的Customer游离对象加入到session2的缓存中

         session2.update(customer);

         tx2.commit();

         session2.close();

    当执行session2的update()方法时,由于session2的缓存中已经存在了OID为1的Customer持久化对象,因此不允许把OID为1的Customer游离对象再加入到session2的缓存中,Session在运行时会抛出异常。此外,当update()方法关联一个游离对象时,如果在数据库中不存在相应的记录,也会抛出异常。

分享到:
评论

相关推荐

    hibernate session详细方法,值得珍藏

    本文将深入探讨Hibernate Session的详细方法及其应用场景,旨在为开发者提供一份全面、实用的指南。 #### 一、Session 的生命周期与事务管理 Hibernate Session的生命周期通常包括打开、使用和关闭三个阶段。在...

    hibernate session生命周期示例

    - **更新**:调用`update()`方法将更新一个已存在的持久化对象。 - **删除**:使用`delete()`方法可从数据库中删除一个持久化对象。 4. ** flush 操作**: Hibernate不会立即执行所有数据库操作,而是将它们缓存...

    重写hibernate的session简单增删改查

    重写Session主要是继承Hibernate的DefaultSessionImpl或者BaseSessionImpl,并覆盖其中的方法,比如在save()、update()、delete()之前或之后添加自定义代码。此外,也可以扩展query()方法来实现更复杂的查询逻辑。 ...

    对Hibernate Session做一个简单的包装

    `Session`接口提供了多种方法来与数据库交互,如`save()`, `update()`, `delete()`, `get()`, `load()`以及`createQuery()`等。然而,在实际开发中,我们往往需要根据项目需求对其进行定制,例如添加事务管理、异常...

    Hibernate(session管理)

    这意味着,只要在事务范围内对对象进行修改,无需显式调用update()方法,Hibernate也会自动处理。 9. **优化策略**:为了提高性能,开发者可以调整一些Hibernate配置,如批处理(batch-size)、懒加载(lazy-...

    hibernate和session学习

    `Session`的常用方法包括:`save()`, `update()`, `delete()`, `get()`, `load()`, `query()`等。 1. `save()` 和 `update()`: `save()`用于将新对象持久化到数据库,如果对象已经存在,可以使用`update()`来更新其...

    Hibernate的Session的javadoc

    Hibernate的Session接口是Java应用程序与Hibernate之间主要的运行时交互接口,它提供了对持久化对象的创建、读取和删除操作。Session的概念是基于对象的状态管理和数据库事务的,它的生命周期通常与一个物理事务绑定...

    Hibernate update问题

    Hibernate通过Session接口的`update()`方法实现对象的更新。当你从数据库加载一个对象,修改其属性,然后调用`update()`方法,Hibernate会根据对象的状态自动执行相应的SQL UPDATE语句。然而,如果对象不在Session...

    实现自己的Hibernate框架之Session 方法实现

    本篇文章将深入探讨如何实现自己的Hibernate框架,特别是Session方法的实现,这对于理解ORM的工作原理及优化数据库访问逻辑具有重要意义。 首先,我们需要了解Hibernate的核心概念——Session。在Hibernate中,...

    hibernate session.doc

    除了`delete()`方法,`Session`还提供了其他操作,如`save()`、`saveOrUpdate()`和`update()`,它们分别用于保存新对象、根据现有状态决定保存或更新对象以及更新对象的现有状态。另外,`Session`还有一系列方法用于...

    HibernateSession , Transaction 研究

    本文将深入研究Hibernate中的`Session`和`Transaction`,这两个概念是理解Hibernate工作原理的关键。 首先,让我们了解`Session`。在Hibernate中,`Session`充当了应用程序与数据库之间的桥梁,它是持久化操作的...

    Hibernate持久层方法汇总

    本文将详细介绍Hibernate持久层中的一些核心方法,包括`session.load`, `session.find`, `session.iterator`, `session.save`, `session.update`, `session.saveorupdate`。 1. `session.load()`: - `load()`方法...

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

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

    JavaEE技术-自主学习.zip_hibernate_hibernate session _javaee映射.xml

    session.update(user); // 查询 User fetchedUser = (User) session.get(User.class, 1L); // 删除 session.delete(fetchedUser); session.close(); sessionFactory.close(); ``` 在`JavaBeanTest71`这个文件中...

    Hibernate_11session

    Session提供了各种操作数据库的方法,如`save()`, `update()`, `delete()`, `load()`, `get()`等,它们都是事务性的。比如,`save()`方法用于保存一个新的对象到数据库,`update()`用于更新已存在的对象,而`delete...

    使用hibernate封装方法

    - DAO实现类继承或实现该接口,并使用Hibernate Session进行实际的数据操作。 2. **Service设计**: - Service接口定义业务逻辑,调用DAO进行数据处理,如`addUser()`, `editUser()`, `removeUser()`, `...

    Hibernate Session 4种对象状态.docx

    如果对象的属性发生改变并希望更新到数据库,需要重新获得Session,并调用merge()或update()方法。 4. **删除状态(Removed State)**: 调用Session的remove()方法后,持久化对象会被标记为删除状态。这个对象的...

    Hibernate merge、update与saveOrUpdate方法的区别

    ### Hibernate merge、update与saveOrUpdate方法的区别 在Hibernate框架中,`merge`、`update`与`saveOrUpdate`这三个方法都是用于更新或保存实体对象到数据库中的,但它们之间存在着重要的区别,这些区别主要体现...

    hibernate常用方法集合

    Session提供了操作实体的方法,如`save()`, `saveOrUpdate()`, `update()`, `delete()`等。例如,`save()`方法用来持久化新对象,`saveOrUpdate()`判断对象是否已存在,如果不存在则保存,否则更新,`update()`更新...

    Hibernate更新某些字段

    如果我们直接使用 Session.update(Object o) 方法,Hibernate 会生成一个更新所有字段的 SQL 语句。这可能会导致性能问题,特别是当某些字段类型是文本类型且内容非常大时。 例如,在下面的代码中,我们使用 ...

Global site tag (gtag.js) - Google Analytics