如果阻止Hibernate自动保存已经被修改的实体

用的是ssh2架构。
由于采用了是struts2的ModelDriven, Preparable两种方式
如果entity的赋值时自动完成的。
比如要修改一个用户
页面中的form表单值传递到后台之后会自动个user对象,user对象是从hibernate中获得。
然后才是调用到我的action方法。

如果我在这时将user对象直接保存,则整过过程没有问题
问题出现在,如果我要在我的action代码里判断数据是否合法,这时可能需要再次查询数据库,
问题就出来了,hibernate会先自动将user对象保存到数据库中,是这实际并不是我想要的效果。
我希望是我调用save方法之后才会保存到数据库,而不是通过自动保存的方式。
有什么方法来解决这个问题吗?

6个回答

[quote]
但是如果我将要保存的对象evict掉,后面我真正想保存的时候也保存不了了,错误现象在上面
[/quote]

你还是没理解我的意思。hibernate在每个session里都会做些处理,比如把查询过的对象缓存起来什么,这个时候这些对象的实例是和数据库保持关联的,hibernate会记录session生命周期内所有缓存对象的操作过程,最后都会反映到数据库去,也就是所谓的托管状态,所以才会有自动更新这种问题。只要每次都把查询到的对象用evict(或clear)清除([color=red]记得,是每次[/color]),那么就不会有托管状态的entity,也就不会有自动更新,但这不会影响(应该)update(或saveOrUpdate)操作,evict只是清楚实例与数据库的关联而已,不是清楚实例本身。
[quote]a different object with the same identifier value was already associated with the session[/quote]
这个异常是说已经有另一个相同具有id的对象被session托管了,说明之前有对象查询过后没有清掉,所以我说:
[quote]每次查询后都直接evict清掉,至少这样就不会存在托管状态的entity了。[/quote]

试一下第一次从hibernate中获得user实例后先清空hibernate的session缓存,就是那个evict(user)。

[quote]
先感谢回答
如果先执行evict的话,但是后面在执行save会报下面的错
a different object with the same identifier value was already associated with the session
[/quote]

原则上后面不应该用save方法,因为你执行的是修改操作,应该使用update或saveOrUpdate方法,save方法等于sql语句直接insert一个已有的id,当然会错。

有两种办法试试,不一定对:
1.用clear代替evict方法清缓存,可能有未知的实例没有清空(被struts2屏蔽了);
2.显示调用update或merge方法,不过也可能出这种异常。

其实本人对hibernate的缓存一直就很不爽的说……

哦,我发现了,先试试这个:
你在save前还有第二次查询,要把这次查询出的对象也用evict清掉才行……

[quote]
感谢回答
好像还是不行。
我在设置完实体对象之后,还有两次数据库查询其中第一次查询并没有引发update,但是第二次查询就引起了update操作。而这两次查询的对象和我本要保存的对象之间并没有建立hibernate一级的关联。
[/quote]
……
好吧,试下每次查询后都直接evict清掉,至少这样就不会存在托管状态的entity了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Hibernate 修改实体问题
Employee 类对应 employee表 大概有 20个字段。rn 我要修改一个员工信息时大概表单里有15个熟悉可能要被修改,我选择修改整个实体,但是在修改后 其他5个字段的值在数据库中的值变成空了,rnrn 在action里面我时这么做的:注入employeeService ,new一个employee对象,从表单获得数据填充这个对象, 底层执行的方法时 getSession().saveorUpdate(),rnrn还试了先从数据库取得当前要修改的对象 再从表单获得数据set进去,但是提示 two open sessions 错误。rnrn 不知道如何解决
如何防止hibernate对entity实体的自动保存
Hibernate有一个机制,对于get出来的实体,一旦用setxxx方法改变过属性值,在事务完结前它会很聪明地将其持久化(亦就是保存至数据库),不知道为什么它这样做的原因是什么,毕竟我还没有使用saveorupdate呢,就给我更新了。      比如如下代码: List lvTmp=mTdDao.find(TdMenuCategory.class,"select * from td_me
怎样阻止插入数据自动保存
我用的是ADODataset和datasource、dbgrid我做了"插入"、“删除”、“上一条”、“下一条”以及“确定”,但是往往是我进行“插入”之后就是不按“确定”随便点一个“上一条”和“下一条”它就把当前插入的这条数据保存了,请问我如何防止这一点,不然我得“确定”意义不大,而且用户很容易进行误操作。
hibernate 自动保存
TXjChart tXjChart = (TXjChart) this.hibernateTemplate.load(TXjChart.class, id);rntXjChart.set.... 改变属性值。。。。。rnrnList aa = this.hibernateTemplate.findByCriteria(dc); // 这个时候已经保存了, rnif(aa.size()>3)rn////不保存rnelsernsave(tXjChart)rn..rnrnrnrn怎么让list的时候不自动保存啊
表修改,内容自动保存?
在SQL 2005中如果打开表进行修改,那么它会自动保存,可是一点修改错了怎么办?如何恢复?
如果判断 Recordset已经被new
如题rn如何判断Recordset已经被new过了
如果判断一个对象已经被释放资源了?
就是如果调用了obj.free这样的方法,rn我在后面的程序中如果得知obj已经不可用了呢?
如果判断一个应用程序已经被打开?
VFP9.0+SQLrnrn编译后,双击运行.rnrn为了避免用户连续双击,从而连续运行可执行文件,而产生一些错误.rnrnif[color=#FF0000] AAA.exe已经运行[/color]rn messagebox("已经运行.")rnendifrnrnrn请老师帮看一下,上述红色部分,如何写代码?rn
如果判断一个对象是否已经被释放?
TCppWebBrowser FWebBrowsers[0] = new TCppWebBrowser(this)rn如何判断FWebBrowsers[0]->Free();rn如果已经Free(),则不做操作rn如果还未Free(),则进行Free()操作
JAVASCRIPT弹出窗口被阻止.
rn这里有段JAVASCRIPT,我已经实现的了.脚本的意思就是打开一个窗口,然后过几分钟之后又再这个弹出窗口基础上转向到另外一个页面.但是会被IE屏蔽,我尝试用过.rnwindow.showModalDialog(),但执行到打开,就停止执行下面的了.所以问问大家有没有好的代码提供一下
flash被ie阻止?
我插入flash,用dreamweaver cs3rn代码: rn rn rn rn rn rn被ie阻止rn如何解决??rn
第三方cookie被阻止?
一个留言页面,用iframe调用,但是在别人的网站上总是提示验证码错误,好像是因为第三方cookie(用来存储Session的)被IE阻止了?请问如何解决?参见页面: http://www.ksoub.cn/zxly.html 本站上就可以: http://www.v-ns.cn
SWF被阻止的问题
我用IE6.0.2900.2180.xpsp.sp2_gdr.050301-1519,swf文件的查看被阻止,每次要允许被阻止内容才能看到,不胜其烦.哪位大虾指点一二.谢谢!
浏览器被阻止
rn 我的页面有一个打印功能,用的是浏览器的WebBrowser,当我点击打印时,浏览器会出现rnrn Internet Explorer has blocked this site from using an ActiveX control in an unsafe manner.As a resultrnrn this page might not display correctly.rnrn 这种情况,如果我点击左下角,会弹出错误:rnrn Object doesn't support this property or method(对象不支持此属性或方法)rnrn 请大家帮帮忙啦!谢谢各位!在线等。
下载文件被阻止
我在一个页面生成Excel文件,但是在下载时被阻止了,客户的机器是XP或2003,rn不知道是什么原因,怎么解决,rn请高人帮梦了
阻止对话框被销毁
A程序会销毁B对话框(B对话框为A的子窗口,对话框句柄可知),如何编写C程序实现B不被A销毁?rnrn语言最好是C++rnrn大神们!帮忙解决一下吧!
网络爬虫被阻止
个人写了网络爬虫,但是爬一些网站的时候都阻止连接,应该怎么解决
window.open()被阻止的问题
用window.open()打开一个只有标题栏的web窗体,每次都被阻止,要设置"总是允许来自此站点的弹出窗体",有没有什么办法不被阻止也不要去设置就能直接打开只有标题栏的web窗体,包括IE6,IE7,用ajax?行么?
安装被策略阻止
有用的键盘插到电脑,显示:安装被策略阻止    自己解决办法  1.点击开始菜单(或使用“Win+R”键)→键入“gpedit.msc”回车。  2.依次展开:“计算机配置”→“管理面板”→“系统”→“设备安装”→“设备安装限制”。  3.双击右侧的“禁止安装未由其他策略设置描述的设备”→选择“已禁用”。  4.卸载这个未识别的驱动,重新启动系统,拔下键盘重新插上,即可。网上找的备用一
IIS 80端口被阻止
自定义规则阻止端口 1-65535,排除项为,internet.exe,qq.exe........rnmcafee 日志显示 这条自定义阻止 了 IIS 80端口rnrnrn排除项中 加入 了 IIS.msc 但依然阻止本地IIS 的 访问~~rnrn有没有人用过,告诉下怎么排除掉这个 80
那些被阻止的页面
我们遇到了什么? 有时候需要我们跳到新的窗口,比如跳出到支付,比如跳出到详情页面。 你说这简单,我们有window.open()有target="_blank",但是有时这些方法会是失效,被浏览器拦截掉,不能直接跳出到新的页面,需要用户手动放行。 有种说法是:打开新窗口到操作必须是用户主动触发到,这样的描述有些模糊。下面到3种方法都是用户主动触发的 <input type="button...
spring hibernate load后自动保存
SSH,spring管理事务。rn第一步:entity = load(id);获取一个对象。rn第二步:检查entity的Name属性数据库中是否有重复,不重复执行update,重复抛出异常。rn但是异常抛出后这个entity依然被保存了。rnn[b]问题补充:[/b]nSSH,spring管理事务。 rn第一步:entity = load(id);获取一个对象。 rn第二步:从表单获取值给ENTITY,ENITITY传给SERVICE,然后再到DAO,DAO里有个校验器(校验器要查数据库),校验失败抛出异常.校验通过执行UPDATE.rnrn但是异常抛出后这个entity依然被保存了。rnrn感谢 totong 的回答.
hibernate实体关联
详细描述了hibernate3中的实体映射
hibernate实体影射
hibernate简单入门 实体影射教你快速上手
hibernate单实体的级联查询
其实单实体的一对多和多对一和2个实体的用法是一样的,现在以user为例:   java代码:   package com.test.bean; import java.util.Set; public class User{ private Integer id; private String firstname; private String lastname; private In...
hibernate实体关系映射实例
Hibernate(六):实体关系映射
1,多对一单向关联 单向 n-1 关联只需从 n 的一端可以访问 1 的一端 实例:Product和Factory之间的关系
hibernate实体配置详解
hibernate实体配置详解
hibernate实体关系映射
几种实体间的关系: 一对一:有两种方式 主键关联:从表的主键同时又是主表的外键。从表没有单独的外键列。 主表对应类 com.lovo.bean.ManBean"table="man"> id"> native"> manName"column="manName"> 关联表  name表示属性名   class为该属性的类型
hibernate实体监听器
上学期学完spring的基本增删改查后,还曾有点小小的得意,感觉自己也算知道不少的编程知识了,但这段时间的项目经验又一次次的教了自己做人,不断出现的新知识让自己目不暇接,知道的越多,未知的越多。 也算进入了学习的另一个阶段: 知道自己不知道 感慨完了,该进入正题了,本周有一个需求,spring sercurity要求在保存密码的时候密码...
Hibernate 实体关联关系映射----总结
Hibernate 实体关联关系映射----总结   花了三天的业余时间,终于写完了Hibernate关联关系映射的所有实例,感觉还应该总结一下。   Hibernate映射关系错综复杂,在实际中真的都能用到吗?不用行吗?   在我看来,Hibernate提供这些映射关系,常用就是一对一和多对一,并且在能不用连接表的时候尽量不要用连接表。多对多会用到,如果用到了,应该首先考虑底层数据库...
Hibernate实体关联关系映射
一、什么是Hibernate中的关联映射?   简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射。   它将数据库中的表映射成对应的对象,以对象的形式展现,这样我们就可以通过映射的对象来对数据库中的数据进行间接的操作。   关联映射是将数据库中的表映射成与之相对应的对象,当你对这个对象进行操作的时候,Hibern...
Hibernate实体关系映射
一、概述  接上一篇:Hibernate简单示例,进行研究实体关系映射。单边的一对多关系、单边的多对一关系、双边的多对一和一对多关系。 二、数据表结构 一个House有多个Cat。House与Cat是一对多的关系。 tb_cat表中有列:id、name、house_id tb_house表中有列:id、name 三、单边的一对多关系---@OneToMany
Hibernate实体属性的问题
如果一个实体中包含一个实体,这个实体又包含另一个实体,这样关联起来是不是性能很差呢,一般是不是避免这种多层次的关联啊?而是使用一个普通的外键来自己查询?rn如果真这么多关联的话hibernate的查询在非懒加载情况下会一下子查很多表吧。
execl 能不能被自动保存?急!!
我知道word 有每隔一段时间可以自动保存。但不知道如何使execl 也有此功能(急用)rn谢!rn
Hibernate级联查询实体关系映射
Hibernate  实体关系映射 4.  使用 MyEclipse 的 的 反向 工程 向导 生成 关系 DB Browser 中的表中右击-->Hibernate reverse Engineering... 选择所选择表的主键生成方式,如图中进行配置,选择 native:
hibernate实体对象的生命周期
8.2 实体对象的生命周期 8.2.1 实体对象的3种状态 (1)自由状态Transient 自由状态转持久状态session.save 结论:处于自由状态的实体对象,可以通过Session.save方法转换成持久状态。 如果一个实体对象是由hibernate加载(如通过Session.load方法获得),那么,它也处于持久状态。 (2)持久状态Persistent 持久状态的对象对
Hibernate实体对象操纵
介绍的很详细,个人觉得不错!!!
Hibernate实体关联速查表
本速查表没有打成CHM! Hibernate实体映射表实用性较强! 希望大家喜欢!
hibernate映射实体对象?
rt
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数