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
相关推荐
hibernatetools-Update-4.1.1.zip
MyEclipse自动生成hibernate实体类配置文件
自动生成hibernate映射文件和实体类
hibernate实体生成工具
Hibernate 实体类 注解及功能说明。
Hibernate实体层设计.rar hibernate就是一个面向对象的一个框架
hibernate实体映射文件字段设置默认值
Eclipse中Hibernate插件。
本速查表没有打成CHM! Hibernate实体映射表实用性较强! 希望大家喜欢!
Eclipse用于Hibernate框架开发插件,全CSDN最低资源分下载,让你吃上真正的石灰。。。
可以根据数据库中的表生成hibernate实体类,需要自己修改jdbc.properties配置文件。
MyEclipse10.7由表自动生成Hibernate实体对象,由本人亲自实践,非常实用。。
hibernate 经典描述对你理解会有一定的帮助的
hibernate代码自动生成
MyEclipse由表自动生成Hibernate实体对象_白杨,是一个非常好的ORcl,MYEXCLIpce 教材
将数据库表中的字段映射成hibernate实体类
eclipse从数据库逆向生成Hibernate实体类
里面包含Hibernate实体映射的具体实例代码,还有相关教程笔记,喜欢的可以学习学习。
用MyEclipse自动生成hibernate映射文件和实体类