`
qu_xiangjun805
  • 浏览: 20268 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

session update 实体

阅读更多
关于Session接口的update方法主要有如下几点要注意:

1.输入参数

一般而言,传递给update的对象要是处于游离状态的对象。如果传一个持久化对象,那么update方法就是多余的,因为Hibernate的脏检查机制会自动根据对象属性值的变化向数据库发送一条update语句;如果传入的对象处于临时状态,那么此时Hibernate应该会抛出异常。因为Hibernate在更新数据时会根据对象的OID去数据库查找相应的记录并更新之,而在数据库中是没有记录与这个临时对象相关联的,因此Hibernate会抛出异常,当然如果你人为的给临时对象指定一个OID就该另当别论了,如下所示代码片段:

…………………………………………

Customer customer=new Customer();

customer.setId(3L);

customer.setName(“Cindyelf”);

session.update(customer);

…………………………………………

这段代码会导致如下的sql:update Customer set name=’Cindyelf’ where  id=3;当然如果数据库不存在id为3的那行记录,Hibernate就会抛出异常。而给临时对象指定OID是不合规范的操作,应尽量避免。也就是说不管传入是什么状态对象,数据库中必须要有一条记录与这个对象的OID相对应,否则抛出异常。

2.操作

执行update方法的时候,Hibernate会首先把传入的对象放入Session的缓存中,使之持久化,然后计划执行一个update语句。Hibernate在生成sql语句的时候会根据对象的当前属性值来组装sql语句,也就是说,不管程序中修改了多少次属性值,在执行时只会执行一条update一句。

此外,在update的官方API中特意强调了一点,“如果在session的缓存中有一个持久化对象和所要更新的对象具有相同的OID,那么Hibernate会抛出异常”。下面的代码片段演示了这个错误:

…………………………………………

Customer customer=new Customer();

session1.save(customer);

…………………………………………

…………………………………………

Customer customer1=(Customer)session.load(Customer.class,new Long(6))

session2.update(customer);

…………………………………………

如上所示,我在session1中持久化了一个Customer对象,它的OID是6,然后我在session2中load一个OID为6的对象customer1,然后在session2中update之前的customer,注意,对于session2而已,customer1是处于游离状态的,因为它不处于session2的缓存中。此时程序会报如下错误:a different object with the same identifier value was already associated with the session。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/CMTobby/archive/2007/08/11/1738392.aspx


分享到:
评论

相关推荐

    重写hibernate的session简单增删改查

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

    hibernate和session学习

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

    hibernate session生命周期示例

    Session对象负责管理实体对象的状态,包括保存、更新、删除和检索数据。它的生命周期主要包括以下几个阶段: 1. **创建Session**: 当我们调用`SessionFactory.openSession()`方法时,一个新的Session实例就会被...

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

    SessionFactory由Configuration实例创建,配置文件通常为`hibernate.cfg.xml`,其中包含了数据库连接信息、实体类映射等设置。 接下来,我们可以通过SessionFactory获取Session实例。然后,可以使用Session的`save...

    Hibernate实体映射

    例如,可以通过`session.saveOrUpdate()`方法将新创建的对象持久化,`session.get()`或`session.load()`用于获取已存在的对象,`session.update()`更新对象,`session.delete()`删除对象。 五、查询语言HQL和 ...

    hibernate session详细方法,值得珍藏

    如果实体的ID已知且实体处于持久化状态,`update()`将同步实体的状态更改到数据库。 - **`delete(Object object)`**:从数据库中删除指定的实体。如果实体关联有级联操作(如`cascade="delete"`),则所有相关的...

    Hibernate update问题

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

    Hibernate实体层设计

    通过Session,我们可以实现增删查改(Create, Read, Update, Delete)操作,如Session的save()、get()、update()和delete()方法。 4. 查询语言(HQL) Hibernate提供了一种面向对象的查询语言——HQL,类似于SQL,...

    Mysql映射java实体类

    例如,使用Hibernate的`Session`接口来保存、查询、更新或删除实体。 ```java SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session session = sessionFactory....

    rfc3311_sip_UPDATE.txt

    ### Session Initiation Protocol (SIP) UPDATE Method #### 引言 本文档定义了会话发起协议(SIP)中的新方法:`UPDATE`。该方法允许客户端在对话(dialog)建立后更新会话参数(如媒体流及其编解码器),但不会...

    Hibernate_11session

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

    springmvc+session+增删改查+登录案例

    在文件列表中看到的“springmvc”可能是一个包含Spring MVC配置和源代码的目录,而“新建文件夹”可能包含了具体的案例代码,比如Controller、Service、DAO、实体类(Entity)以及视图模板(如JSP或Thymeleaf文件)...

    对Hibernate Session做一个简单的包装

    根据项目需求,包装类可以提供一些简洁的API,比如`saveOrUpdateEntity(Entity entity)`,结合`save()`和`update()`的功能,或者`deleteById(Class<?> entityClass, Serializable id)`,根据ID删除实体。 7. **查询...

    hibernate操纵实体对象

    在这个主题“hibernate操纵实体对象”中,我们将探讨如何使用Hibernate来创建、更新、删除和查询数据库中的实体对象。 首先,`HibernateSessionFactory`是Hibernate的核心组件之一,它负责创建`Session`对象。`...

    Hibernate merge、update与saveOrUpdate方法的区别

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

    Hibernate实体对象操纵

    #### 3.2 更新(Update) 对于持久态对象,修改其属性后,Hibernate会在事务提交时自动更新数据库。若对象变为游离态,可以使用merge()方法使其变为持久态并同步数据库。 ```java entity.setProperty(value); ...

    Spring与Hibernate集成中的session

    - 数据操作:如`Session.save()`, `Session.get()`, `Session.update()`等。 - 提交事务:`Transaction.commit()`。 - 关闭`Session`:`Session.close()`。 5. **Spring的事务管理** - 声明式事务管理:通过`@...

    Hibernate中的实体状态及转换

    游离状态的对象可以通过Session的`update()`, `saveOrUpdate()`方法重新纳入Session的管理,恢复为持久化状态。 接下来,我们详细讨论这些状态之间的转换: **临时状态(Transient) -> 游离状态(Detached)**:要将...

    HQL语句详解Select/update/deletefromwhere...

    Query queryUpdate = session.createQuery(hql); int ret = queryUpdate.executeUpdate(); trans.commit(); ``` 同样地,也可以使用HQL执行删除操作: ```java Transaction trans = session.beginTransaction(); ...

    HQL 语法总结 实体查询

    Query query = session.createQuery("update TUser set age = 18 where id = 1"); query.executeUpdate(); ``` - **删除实体**: ```java Query query = session.createQuery("delete from TUser where age >=...

Global site tag (gtag.js) - Google Analytics