1、问题描述
在action中将通过<T> T org.springframework.orm.hibernate3.HibernateTemplate.get(Class<T> entityClass, Serializableid) throws DataAccessException方法获取到的实体对象,部分属性做了修改后作为action的返回结果返回页面;然后在浏览器刷新页面;结果上述被修改的属性被自动update了。
2、问题原因分析和解决办法
2.1 查看日志信息后发现,系统总是会打印出一个update语句。说明系统的确是执行了更新操作的,但是我并没有调用任何和update相关的方法。
2.2 跟踪代码发现,getById方法其实是调用了hibernate的get方法。嗯,果然,问题出在这里了.....
2.3 Hibernate的get和load方法查询出的实体都是持久化对象,拿到该对象后,如果你调用了该对象的set方法,那么在事务递交的时候,Hibernate会把你设置的值自动更新到数据库中。
解决办法:
在获取实体对象后,调用下getHibernateTemplate().evict(entity)方法,该方法的作用是把持久化对象变成托管状态。变成托管状态后,Hibernate就不会再去自动更新该实体。
3、相关知识扩展
Hibernate的几种实体状态:
1.瞬态:
一个实体通过new操作符创建后,没有和Hibernate的Session建立关系,也没有手动赋值过该实体的持久化标识(持久化标识可以认为是映射表的主键)。
此时该实体中任何属性的更新都不会反映到数据库表中。
2.持久化:
当一个实体和Hibernate的Session创建了关系,并获取了持久化标识,而且在Hibernate的Session生命周期内存在。
此时针对该实体任何属性的更改都会直接影响到数据库表中一条记录对应字段的更新,即与数据库表同步。
3.脱管:
当一个实体和Hibernate的Session创建了关系,并获取了持久化标识,而此时Hibernate的Session生命周期结束,实体的持久化标识没有被改动过。
针对该实体任何属性的修改都不会及时反映到数据库表中。
关闭session可以使实体从持久化状态转为托管状态。
知识扩展部分参考自 http://blog.csdn.NET/sunhuwh/article/details/9183539 ,感谢作者。
转帖请注明文章来源: http://blog.csdn.net/yang_lover/article/details/45057181
相关推荐
Ajax(Asynchronous JavaScript and XML)允许在不刷新整个页面的情况下与服务器交换数据并更新部分网页内容。在租房系统中,可以实现如下功能: 1. 搜索房源:用户输入条件后,后台通过Ajax请求获取匹配的房源数据...
1. EhCache:EhCache是Hibernate默认的二级缓存提供商,支持本地内存缓存和分布式缓存,可配置缓存策略,如定时刷新、大小限制等。 2. Guava Cache:Google的Guava库提供了缓存功能,可以集成到Hibernate中作为二级...
- **处理脱管数据**:当实体从Session中移除后成为脱管状态,可通过`merge()`或`update()`方法重新关联。 - **重新关联脱管数据**:使用`merge()`方法将脱管实体变为持久化状态。 - **合并脱管数据**:通过`merge...
通过持久化上下文,开发人员可以执行实体的保存、删除、刷新和查询等操作。此外,Hibernate 还支持对未初始化实体的引用获取、按自然ID检索实体、以及对已管理或持久化状态的修改。对于脱离持久化上下文的数据,...
一级缓存,也称为会话缓存(Session Cache),是默认启用的,由Hibernate自动管理。它存储了当前会话期间加载的所有实体对象和关联的集合对象。当会话关闭时,一级缓存中的数据会被清除。一级缓存的主要作用是减少对...
有了实体类和映射配置后,就可以进行持久化操作了。Hibernate提供Session接口来处理数据库交互,例如: 1. `Session.openSession()`用于打开一个新的会话。 2. `Session.save()`或`Session.persist()`用于保存新对象...
这个属性的值可以是"create"、"update"、"validate"等,其中"create"会在每次启动时创建全新的表,"update"会根据实体类更新已有表结构,"validate"则只会验证现有表结构是否匹配,不会做任何改变。 **Token机制** ...
级联操作允许我们将对一个实体的更改自动应用到与之关联的其他实体。在一对多关系中,如果一个实体(父实体)与多个实体(子实体)关联,设置级联属性可以确保在处理父实体时,子实体的操作也会随之进行。例如,当...
2. **Hibernate配置**:包括Hibernate的配置文件(hibernate.cfg.xml),数据库连接设置,实体类的映射文件(hbm.xml)。 3. **Session和Transaction**:Hibernate中的Session是与数据库交互的主要接口,负责保存和检索...
4. 持久化Context(上下文)章节,解释了实体的持久化机制,包括实体的创建、删除、检索以及状态的刷新等操作。此外,还介绍了如何管理和使用游离态数据。 5. 访问数据库部分,讲解了Hibernate如何通过不同的连接...
- **解决脏数据问题**:Hibernate提供了一种机制来解决脏数据的问题。当Session关闭或事务提交时,Hibernate会比较当前对象的状态与最后一次刷新时的状态,如果发现有变化,则会执行必要的SQL语句来同步这些变化到...
介绍了实体的生命周期和持久化状态管理,包括实体的持久化、删除、获取、刷新、托管状态变更以及游离态数据的处理。 5. 访问数据库: 讲解了如何配置Hibernate的连接提供器(ConnectionProvider),如何使用不同的...
级联操作允许在一个实体的操作中自动处理其关联的实体。例如,`CascadeType.ALL`将使保存、更新、删除等操作同时作用于主实体和关联实体。 9. **实体关系映射** Hibernate支持多种关系映射,包括一对一(OneToOne...
Ajax(异步JavaScript和XML)允许在不刷新整个页面的情况下更新部分Web内容。在Hibernate应用中,可以通过Ajax技术实现动态数据加载,提高用户体验。 例如,使用jQuery的Ajax方法: ```javascript $.ajax({ url: ...
2. **配置与实体类**:在Hibernate中,通过XML配置文件或注解方式来定义映射关系,创建对应的实体类,使得数据库操作变得直观且灵活。 3. **Session与Transaction**:Hibernate的Session接口提供了对数据库的临时...
**3.4 初始化数据后获得实体** - 在需要实体数据的情况下如何正确地加载实体。 **3.5 通过自然 ID 获得实体** - 介绍了使用自然 ID(如身份证号、用户名等)来查询实体的方法。 **3.6 刷新实体状态** - 当实体...
<property name="hibernate.hbm2ddl.auto">update <!-- 映射文件位置 --> </hibernate-configuration> ``` #### 二、实体映射文件详解 在示例中还提到一个`Customer.hbm.xml`映射文件,该文件定义了`...
它使前端可以动态地与后端交互,更新页面而无需刷新整个页面,提高了用户体验。DWR提供了一套安全的API,开发者可以通过这些API在客户端直接调用服务器上的Java方法。 这个OA系统利用这四个技术,构建了一个高度...