关于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
分享到:
相关推荐
更新数据时,首先需要从数据库加载需要更新的对象,然后修改对象的属性,最后调用Session的update()方法。Hibernate会识别出对象的变化,并生成对应的SQL更新语句。 4. 查询(Query) 查询是通过Session的get()、...
`Session`的常用方法包括:`save()`, `update()`, `delete()`, `get()`, `load()`, `query()`等。 1. `save()` 和 `update()`: `save()`用于将新对象持久化到数据库,如果对象已经存在,可以使用`update()`来更新其...
Session对象负责管理实体对象的状态,包括保存、更新、删除和检索数据。它的生命周期主要包括以下几个阶段: 1. **创建Session**: 当我们调用`SessionFactory.openSession()`方法时,一个新的Session实例就会被...
SessionFactory由Configuration实例创建,配置文件通常为`hibernate.cfg.xml`,其中包含了数据库连接信息、实体类映射等设置。 接下来,我们可以通过SessionFactory获取Session实例。然后,可以使用Session的`save...
例如,可以通过`session.saveOrUpdate()`方法将新创建的对象持久化,`session.get()`或`session.load()`用于获取已存在的对象,`session.update()`更新对象,`session.delete()`删除对象。 五、查询语言HQL和 ...
如果实体的ID已知且实体处于持久化状态,`update()`将同步实体的状态更改到数据库。 - **`delete(Object object)`**:从数据库中删除指定的实体。如果实体关联有级联操作(如`cascade="delete"`),则所有相关的...
Hibernate通过Session接口的`update()`方法实现对象的更新。当你从数据库加载一个对象,修改其属性,然后调用`update()`方法,Hibernate会根据对象的状态自动执行相应的SQL UPDATE语句。然而,如果对象不在Session...
通过Session,我们可以实现增删查改(Create, Read, Update, Delete)操作,如Session的save()、get()、update()和delete()方法。 4. 查询语言(HQL) Hibernate提供了一种面向对象的查询语言——HQL,类似于SQL,...
例如,使用Hibernate的`Session`接口来保存、查询、更新或删除实体。 ```java SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session session = sessionFactory....
### Session Initiation Protocol (SIP) UPDATE Method #### 引言 本文档定义了会话发起协议(SIP)中的新方法:`UPDATE`。该方法允许客户端在对话(dialog)建立后更新会话参数(如媒体流及其编解码器),但不会...
Session提供了各种操作数据库的方法,如`save()`, `update()`, `delete()`, `load()`, `get()`等,它们都是事务性的。比如,`save()`方法用于保存一个新的对象到数据库,`update()`用于更新已存在的对象,而`delete...
在文件列表中看到的“springmvc”可能是一个包含Spring MVC配置和源代码的目录,而“新建文件夹”可能包含了具体的案例代码,比如Controller、Service、DAO、实体类(Entity)以及视图模板(如JSP或Thymeleaf文件)...
根据项目需求,包装类可以提供一些简洁的API,比如`saveOrUpdateEntity(Entity entity)`,结合`save()`和`update()`的功能,或者`deleteById(Class<?> entityClass, Serializable id)`,根据ID删除实体。 7. **查询...
在这个主题“hibernate操纵实体对象”中,我们将探讨如何使用Hibernate来创建、更新、删除和查询数据库中的实体对象。 首先,`HibernateSessionFactory`是Hibernate的核心组件之一,它负责创建`Session`对象。`...
在Hibernate框架中,`merge`、`update`与`saveOrUpdate`这三个方法都是用于更新或保存实体对象到数据库中的,但它们之间存在着重要的区别,这些区别主要体现在对实体状态的处理方式上。 #### 1. `merge` 方法 `...
#### 3.2 更新(Update) 对于持久态对象,修改其属性后,Hibernate会在事务提交时自动更新数据库。若对象变为游离态,可以使用merge()方法使其变为持久态并同步数据库。 ```java entity.setProperty(value); ...
- 数据操作:如`Session.save()`, `Session.get()`, `Session.update()`等。 - 提交事务:`Transaction.commit()`。 - 关闭`Session`:`Session.close()`。 5. **Spring的事务管理** - 声明式事务管理:通过`@...
游离状态的对象可以通过Session的`update()`, `saveOrUpdate()`方法重新纳入Session的管理,恢复为持久化状态。 接下来,我们详细讨论这些状态之间的转换: **临时状态(Transient) -> 游离状态(Detached)**:要将...
Query queryUpdate = session.createQuery(hql); int ret = queryUpdate.executeUpdate(); trans.commit(); ``` 同样地,也可以使用HQL执行删除操作: ```java Transaction trans = session.beginTransaction(); ...
Query query = session.createQuery("update TUser set age = 18 where id = 1"); query.executeUpdate(); ``` - **删除实体**: ```java Query query = session.createQuery("delete from TUser where age >=...