`
woaiyingyu123
  • 浏览: 71132 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

【转】Hibernate在更新时,是可以不用session的update方法的

阅读更多
public void synDevNameWithItil()
{
    Session session = null;
    Transaction tr = null;
    try
   {
      session = HibernateUtil.getSession();
      tr = session.beginTransaction();
      tr.begin();
      Query query = session.createQuery("...");
      List<Device> devList = query.list();
      for(int i=0;i<devList.size();i++)
      {
         Device device=devList.get(i);;
         String itilName= getDeviceNameFromItil(device.getIp());
         if(StringUtils.isNotEmpty(itilName))
         {
           device.setName(itilName);
          }
       }
       tr.commit();
    }
    catch (Exception ex)
    {
       _log.error("", ex);
       HibernateUtil.rollBack(tr);
     }
    finally
    {
      HibernateUtil.closeSession(session);
     }
}

    这段代码就是想更新一下数据库中的Device对应表的name字段。我的同事觉得,怎么没调用session.update方法去更新device呀。当时我很是惊呀,我一直以为这是hibernate最普通的用法。没想到我同事这样的老行家,也还有误区。
   其实hibernate实现的是持久化类对象和数据库之间的透明映射。hibernate努力想做到的就是让hibernate的使用者,不用去关心对象如何从数据库中存入和取出。
   Session提供了三个和存储相关的常用方法:save、update、delete。很多人认为,调用这三个方法时,hibernate就会向数据库发出:insert、update、delete SQL语句。其实不完全是这样的,这三个方法的直接语意,是用来改变持久化对象的状态,而不是用来指挥hibernate向数据库发出sql的。比如:从session中读取一个对象后,立即调用update方法更新,hibernate会忽略这个update调用。

那这三个方法有什么用呢?它们是用来让持久化对象进行状态切换的,如下所示:

save  : 从临时状态 ==》持久化状态
update: 从游离状态 ==》持久化状态
delete: 持久化状态 ==》临时状态

在session中存在的持久化对象是处于持久化状态的。
session关闭后,之前从session中读取的持久化对象即为游离态。
在数据库中不存在的持久化对象为监时态。

上边举的例子,之所以调update不起作用,是因为当前对象已经是持久化状态了,不需要状态切换。

当事务提交时,hibernate会自动按照一定的策略将session中的持久化对象,同步到数据库中,从而自动使数据库的状态和session中的对象状态完全一致。如果要在事务提交前同步,则可以使用session的flush方法。

这是hibernate的一个优秀的设计。它使得hibernate的使用者,可以专注于对象的变化(对象的状态、属性、关系)而不必考虑,对象的变化如何反映到数据库上。

正是由于这一点,使得在hibernate上构造充血模型成为可能。因为,可以直接将持久化类做为领域对象,由hibernate负责领域对象和数据库的同步。

有不馁之处,敬请指正!
[郑重声明]本文章转自http://www.javaeye.com/topic/866091 ----点击查看更多----
分享到:
评论

相关推荐

    Hibernate(session管理)

    8. **脏检查和自动提交**:Hibernate会定期进行脏检查,检测对象的状态变化,并在事务提交时自动更新数据库。这意味着,只要在事务范围内对对象进行修改,无需显式调用update()方法,Hibernate也会自动处理。 9. **...

    Hibernate update问题

    在处理数据更新时,Hibernate提供了多种方法,但同时也可能会遇到一些常见问题。本篇文章将深入探讨Hibernate更新机制及其可能遇到的问题,旨在帮助开发者更好地理解和解决这些问题。 1. **基本更新操作** ...

    Hibernate更新某些字段

    在 Hibernate 中, update 方法可以更新整个对象的所有字段。如果我们直接使用 Session.update(Object o) 方法,Hibernate 会生成一个更新所有字段的 SQL 语句。这可能会导致性能问题,特别是当某些字段类型是文本...

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

    当我们在Session上进行操作时,这些操作不会立即反映到数据库中,而是被缓存起来,直到调用`flush()`方法或者事务提交时才会真正执行。 在开始使用Session之前,需要配置Hibernate的环境,包括创建SessionFactory,...

    重写hibernate的session简单增删改查

    更新数据时,首先需要从数据库加载需要更新的对象,然后修改对象的属性,最后调用Session的update()方法。Hibernate会识别出对象的变化,并生成对应的SQL更新语句。 4. 查询(Query) 查询是通过Session的get()、...

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

    6. **事件监听**:通过事件监听器,可以在对象的生命周期中执行特定操作,如预加载、后加载、预更新等。 实现这些功能需要深入理解JDBC、数据库理论、反射、设计模式等多个领域的知识。对于源码的阅读和分析,可以...

    hibernate和session学习

    1. `save()` 和 `update()`: `save()`用于将新对象持久化到数据库,如果对象已经存在,可以使用`update()`来更新其状态。 2. `delete()`: 删除指定的对象,将其从数据库中移除。 3. `get()` 和 `load()`: `get()`...

    hibernate session生命周期示例

    当我们调用`SessionFactory.openSession()`方法时,一个新的Session实例就会被创建。SessionFactory是一个线程安全的单例对象,它根据Hibernate配置文件生成。创建SessionFactory通常在应用程序启动时完成,而...

    Hibernate的Session的javadoc

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

    hibernate更新操作

    此外,如果对象在Session之外被更新,那么在更新之前需要调用`session.update(object)`来告诉Hibernate你打算修改这个对象。 总结来说,Hibernate的更新操作主要包括配置、创建SessionFactory、打开Session、查询...

    hibernate session详细方法,值得珍藏

    在Java持久化领域,Hibernate无疑占据了举足轻重的地位,而`Hibernate Session`则是其中的核心组件之一,它提供了与数据库交互的主要接口,是对象/关系映射(ORM)的关键部分。本文将深入探讨Hibernate Session的...

    对Hibernate Session做一个简单的包装

    3. **日志记录**:为了追踪数据库操作,包装类可以在每个方法的开始和结束处记录相关信息,如操作类型、受影响的对象等。 4. **性能优化**:可能包含一些性能优化策略,比如批处理(batch processing),通过批量...

    Hibernate持久层方法汇总

    在实际使用中,开发者通常会在一个`Session`生命周期内进行一系列操作,然后在适当的时候调用`flush()`方法强制Hibernate同步数据库,最后在事务结束时调用`commit()`来完成事务。这些方法的正确组合使用是实现高效...

    Hibernate merge、update与saveOrUpdate方法的区别

    当调用`update`方法时,必须确保要更新的对象已经被加载并且处于持久化状态,否则会抛出异常。`update`方法不会检查对象是否已经存在于Session中,而是直接将对象的状态更新到数据库中。因此,如果尝试更新一个未...

    Hibernate_11session

    通过以上介绍,我们可以看到Hibernate Session在数据库操作中的核心地位,正确理解和使用Session是掌握Hibernate的关键。实践中的具体应用需要结合项目需求,灵活运用这些知识,以实现高效、稳定的数据库访问。

    hibernate常用方法集合

    Session是与数据库交互的主要接口,可以执行查询、插入、更新和删除操作。当不再需要Session时,通常会调用`Session.close()`来释放资源。 4. **事务管理** Hibernate的Session提供了事务管理功能。开发者通常会在...

    hibernate session.doc

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

    HibernateSession , Transaction 研究

    在Hibernate中,`Session`充当了应用程序与数据库之间的桥梁,它是持久化操作的主要接口。`Session`负责管理对象的状态,执行SQL语句,并处理事务。当创建一个新的`Session`实例时,它会与数据库建立一个连接。在...

    在Hibernate应用中处理批量更新和批量删除

    1. **使用`flush()`和`evict()`方法**:在修改实体后,主动调用`session.flush()`方法,使Hibernate将缓存中的变更同步到数据库,然后调用`session.evict(entity)`方法,从缓存中移除实体,这样下一次操作不会受到...

    Hibernate方法总结

    而`iterate`返回一个迭代器,每次调用`next()`方法时才从数据库中获取一条记录,这种方式叫做分页查询,适合处理大数据量的情况,能有效避免内存溢出。不过,由于`iterate`会进行多次查询,所以对于频繁的写操作,...

Global site tag (gtag.js) - Google Analytics