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

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

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

0

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]

0

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

0

[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,当然会错。

0

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

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

0

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

0

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

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
如何防止hibernate对entity实体的自动保存
Hibernate有一个机制,对于get出来的实体,一旦用setxxx方法改变过属性值,在事务完结前它会很聪明地将其持久化(亦就是保存至数据库),不知道为什么它这样做的原因是什么,毕竟我还没有使用saveorupdate呢,就给我更新了。      比如如下代码: List lvTmp=mTdDao.find(TdMenuCategory.class,"select * from td_me
Hibernate 中对象 set 属性时自动保存入库的问题
我的博客原文地址:http://www.yujunyi.com/java/spring-mvc/601.html 欢迎访问 背景 在某个项目中,通过 Heibernate 查出某个对象后,对属性进行了 set 操作,并没有进行 update 操作,但是在数据中自动保存了。 显然这并不是我想要的,我只是想 set 一下属性,在前端显示,并不想入库,但是 Heibernate 自动保存了。 // ...
Hibernate没写保存方法自动保存
hibernate在每个session里都会做些处理,比如把查询过的对象缓存起来什么,这个时候这些对象的实例是和数据库保持关联的,hibernate会记录session生命周期内所有缓存对象的操作过程,最后都会反映到数据库去,也就是所谓的托管状态,所以才会有自动更新这种问题。只要每次都把查询到的对象用evict(或clear)清除(记得,是每次),那么就不会有托管状态的entity,也就不会有自动
避免 Hibernate 中用get/load方法获取的实体调用set方法后自动更新
1、问题症状描述       最近在处理一个新需求问题,代码的大致逻辑是获取一个实体对象,调用该对象的set方法设置其中的某些字段,然后把修改后的实体作为参数供其他地方调用,根据返回值来决定是否更新这个实体到数据库中。       按照这个思路调用了系统中的getByid方法,结果测试的时候发现,不管返回值是什么,这个实体最终都被更新到数据库中了。好吧,这明显是有问题的....【没有问题的代码
Hibernate的方法获取对象后,对象调用set后会自动更新数据库内容的解决办法
例如:Object obj = dao.get(Object_2.classs,id);obj.setName("张三");这种情况下Hibernate下次提交事务的时候会把这个数据库中对应数据更新成set后的。产生原因涉及到Hibernate设计原理,(以下这段话复制地址:http://blog.csdn.net/yang_lover/article/details/45057181)1.瞬态:...
hibernate查询出的实体,set值后,自动更新到数据库
之前做的一个功能,更新订单为取消状态失败,事务回滚,那么订单回滚过后的状态已经是未取消。 但是,事物即使回滚了,但订单状态却被置成了已取消。这个问题困扰了很久。 代码是 OrderInfo orderInfo = orderInfoDao.findByCode(String orderSin);//这底层调用的是hibernate的list(); orderInfo.setOrderSta
如何解决 hibernate 自动更新实体类的问题
如何解决 hibernate 自动更新实体类的问题 示例: GrabOrder grabOrder = (GrabOrder)this.grabOrderDao.getCurrentSession().get(GrabOrder.class,grabOrderId); grabOrder.setNickname(TimeHWUtil.getCurrentDateTime());   上...
解决hibernate查询后自动保存问题
  hibernate在查询后会自动保存流离态的对象,但有时不需要这样的结果。可用克隆解决   用org.springframework.beans.BeanUtils的copyProperties解决   或者org.apache.commons.beanutils.BeanUtils的cloneBean()方法   但如上的都是浅克隆   ===========   如...
hibernate持久化对象值改变后自动更新的条件
在hibernate中,持久化对象分为三种状态: 1)瞬时态 transient  (临时对象) :无持久化标识OID,未与Session关联 , 2)持久态 persistent  :存在持久化标识OID,与Session关联 3)脱管态 detached (离线对象):存在持久化标识OID,未与Session关联 (session.close) 对象的状态可以相互之间进行转换 直
hibernate持久态数据自动更新的执行过程
如图,1、通过session查询出的user对象为持久态对象,同时该持久态对象会放到session一级缓存和快照区(副本)中 2、当修改了user也即持久态对象中属性的值,一级缓存中的内容也会随着修改,但一级缓存对应的快照区内容不会修改, 3、最后提交事务时,比较它们的内容,如果不相同,把一级缓存内容更新到数据库,如果相同,不会更新到数据库。
Hibernate entity属性修改导致对象的记录被修改
当通过hibernate获取到entity后 然后在get属性时修改了属性的值后 然后根据id从新到数据库中查询该实体 这是对应的表中该记录也被修改 如果没重新查询修改不修改还不好说 log分析 当修改实体后在次查询执行了三次hibernate语句 首先执行查询语句 接着执行修改语句 访问实体时又执行了次查询语句 原因分析 当通过herbernate查询出entity后 将被缓存在sess
在解决JPA中 如何防止修改实体的属性后不自动更新数据库问题时遇到的其它问题???...
最近在做一个项目(spingMVC+jpa+mybatis+spring+mysql+...),期间遇到一些棘手的问题,这里贴上关键部分代码如下。 在执行修改的时候根据ID获取指定用户,拿到的实体的状态会不一样呢? 如果将DAO层的findById方法的事务注解  propagation = Propagation.NOT_SUPPORTED  去掉的话,修改时拿到的实体的状态就都是一样的...
解决使用jpa的时候set实体类属性自动持久化
原文地址http://blog.csdn.net/wangyang1354/article/details/50602658例代码Set<User> users = new HashSet<User>(); User user = null; for(int i = 0; i < 10; i++){ user = new User(); user.setUserNam
hibernate实体类反序列化异常
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.type.SerializationException: could not deserialize org.springframework.web.servlet.Fr...
Hibernate 数据的保存,更新和删除
  数据的保存,更新和删除:   1、Session.save()方法:Session.save()方法用于实体对象的持久化保存,也就是说当执行session.save()方法时会生成对应的insert SQL语句,完成数据的保存。如下面的代码:User user=new User();user.setName(“zx”);Transaction tx=session.be
使用saveOrUpdate方法时,若hibernate的session存在了两个具有相同id的不同实体,则会报错
String remindSwitch=request.getParameter("AlertOrNot");         String pushType=request.getParameter("reminderstr");         String earliertime=request.getParameter("earliertime");         String n
hibernate的基本保存操作
紧接着上一篇hibernate的配置,我们来练习hibernate的保存操作; 上一篇《hibernate简介及配置》中我们创建好了UserBasic数据库表实体类。并做了相关的hibernate配置,现在我们来写一个测试用例来进行hibernate保存操作的练习。 第一步:编写测试用例 1.在src目录下创建包com.ballchen.demo; 2.在com
关于hibernate持久化所造成的问题以及解决方案
hibernate的持久化是否困扰到你
Hibernate 实体对象三种状态 :自由,持久,游离
实体对象的状态及转化: 有了上面关于Hibernate缓存的知识,我们再来介绍实体对象的状态就非常容易理解了。 A:自由态对象: 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下: Customer customer=new Customer(“zx”,27,images); 这时customer对象就处于自由状态,为什么说custom...
Hibernate如果查询更改了值,没有save,如果提交了仍然会执行update语句(十一)
Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); Teacher t = (Teacher)session.load(Teacher.class, 1); // t.setName("tttt"); // session.clear(); // t.se
Hibernate保存的两个方法
Hibernate 之所以提供与save()功能几乎完全类似的persist()方法,一方面是为了照顾JPA的用法习惯。另一方面,save()和 persist()方法还有一个区别:使用 save() 方法保存持久化对象时,该方法返回该持久化对象的标识属性值(即对应记录的主键值);但使用 persist() 方法来保存持久化对象时,该方法没有任何返回值。因为 save() 方法需要立即返回持久化对
Excel修改后不能自动保存
你碰到过当Excel内容发生变化时,而你不小心或者无意关闭的时候,竟然没有提示,导致你所做的一切功能都白费吗?经过不断的摸索,我的同事终于把这个问题解决了,且听我慢慢道来: 1. 重新安装看看问题是否解决;如果不行请看2; 2. 切换一个用户看看问题是否解决,如果yes,那说明跟登录的用户有关系了,那请看3吧; 3. 那就要打开注册表了。注册表应该都会的哦,然后按照附件中的顺序操作吧,希望...
Hibernate开发实践笔记--对象在set属性时更新了数据库问题
之前一直没发现这个问题,后来是因为我的导航栏数据库中数据发生变动后,产生菜单的时候又update了一遍数据库中的数据,使得部分数据值为空了,当时觉得很奇怪,后来仔细看了下log4j打印的日志发现其中有更新的动作,在代码中将数据库中获取到的对象set一个对象属性时,数据库就update了,但是这个问题是怎么产生的呢? 问题重述 Set users = new HashSet(); Use
对实体中的指定类型的实体进行修改
/** * Created by jay.zhou on 2018/7/17. */ import java.lang.reflect.Field; import java.util.List; import java.util.Map; /** * 用于操作某个实体的属性的工具类 */ public abstract class FieldUtils&amp;lt;T&amp;gt; { ...
hibernate实体字段属性改变不更新到数据库
在需要的方法或类名增加@Transactional(readOnly=true)import org.springframework.transaction.annotation.Transactional;
hibernate 自动建表 实体类继承父类 父类有主键 启动失败
项目中我们经常把实体类公共的属性抽取出来(主键ID,创建时间crateTime等),抽取成一个BasedModel,然后让有需要的实体类去继承。 package com.test.demo.model; import org.hibernate.annotations.GenericGenerator; import javax.persistence.Column; import jav...
hibernate常见错误 表单提交 导致数据库为空值
1.表单提交内容--emp.name emp.age emp.dept.id Dept类的字段有 id name loc 正确的写法:     表单提交以后会对emp.name emp.age emp.dept.id(这时候的Dept对象里只有id有值 name和loc是空值)     Emp emp;         Dept dept=session.get(Dept.class...
使用Hibernate反向生成实体类(表已存在)
项目中用到hibernate根椐表反向生成实体类的情况,整理如下,如有不足之处欢迎大家指出来,我继续完善。 1.添加jar包     ① hibernate的jar包     ② 数据库的驱动包 2.配置数据库的链接     Window --> Show View --> Db Browser 右击鼠标--> New --> 如下图: 3.添加Hibernate引用
hibernate中的实体类和实体关系映射文件必须遵循的原则
一、提供一个无参的构造器:使Hibernate可以使用Construtor.newInstance()来实例化持久化类 二、提供一个标识属性(identifier property):通常映射为数据库表的主键字段。如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate()                                    
Hibernate实体对象四大状态
首先声明,在Hibernate中,实体对象存在四种状态,而不是三种(相关源码如下,见org.hibernate.event.def.AbstractSaveEventListener.java)。网上流传的hibernate对象三大状态,大概是因为hibernate官方文档没有更新,然后一个接着一个的copy吧,你懂的。
Hibernate三种实体映射,从建表到操作代码
映射关联大致分为三种 : 一对一 ,一对多, 多对多 一.一对一drop table if exists husband; create table husband( id int not null primary key , hname varchar(20) not null collate 'utf8_bin' ); drop table if exists wife; c
【大话Hibernate】Hibernate两种实体关系映射详解
 实体类与数据库之间存在某种映射关系,Hibernate依据这种映射关系完成数据的存取,因此映射关系的配置在Hibernate中是最关键的。Hibernate支持xml配置文件与@注解配置两种方式。xml配置文件是最基础的配置,而@注解是Java的官方JPA(Java Persistence API)提供的。本章分别使用@注解与xml讲解Hibernate的映射配置。一、实体类映射: 从Java的...
hibernate 具有主外键关系的多表级联保存
这是我在学习使用hibernate进行多表级联保存时,遇到的问题,记录下来以便日后查找。 微博图片表 SayFiles.hbm.xml <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernat
Hibernate实体关联关系映射
一、什么是Hibernate中的关联映射?   简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射。   它将数据库中的表映射成对应的对象,以对象的形式展现,这样我们就可以通过映射的对象来对数据库中的数据进行间接的操作。   关联映射是将数据库中的表映射成与之相对应的对象,当你对这个对象进行操作的时候,Hibern...
AutoCAD .Net 禁止图元被删除
禁止图元被用户删除可以通过 ObjectOverrule 实现。 以下代码: 1、命令 AddEraseOverrule 创建两个图元并禁止被删除。 2、命令 RemoveEraseOverrule 移除删除限制。
Hibernate持久化对象修改id重新保存的办法——Hibernate学习记录二
昨天在工作中遇到一个特殊的场景,点击修改,对一条发布状态的记录进行复制,并生成一个草稿版本,也就是同一条记录的不同状态,也就出现需要从数据库get之后把id置空重新保存,这里出现一个问题,但Hibernate的持久化对象是无法对id进行修改操作的,需要重新new一个全新的对象存储才可以,但Java中的机制,如果采用new Object()并赋值的的方式并不是真的产生一个新的对象,而是引用赋值,即传
ActiveX控件在签名以后,仍然被IE浏览器默认安全级阻止而无法安装。
  使用代码签名证书签名后的控件在运行时报“Internet Explorer已经阻止此站点用不安全方式使用ActiveX控件.因此,此页面可能显示不正确”。     这是因为该ActiveX控件没有标记为脚本安全,在IE默认安全级别设置中对没有标记为安全的ActiveX控件进行初始化和脚本运行的代码默认是被禁用的。如果要消除这个提示,必须在控件上加上一个脚本安全标志。     ...
Hibernate如何避免抛出ObjectNotFoundException(某关联的对象被删除)
原文:http://blog.csdn.net/hardwin/article/details/4329652   下面这种情况在加载List的时候更容易出现问题。   我们项目里面配了很多many-to-one的关联,后台在查询数据时已经作了健全性判断,但还是经常抛出对象找不到异常:org.hibernate.ObjectNotFoundException: No row with th...
Hibernate中sql查询返回不受Hibernate管理的实体
Hibernate查询有好多种方法,当我们需要查找自己构建的实体时,需要使用session.createSQLQuery(sql)方法查找实体,但这样只能返回由Hibernate管理的实体,即生成数据库表的那些实体,为了返回任意的自定义的实体,我们需要这样做: sess.createSQLQuery("SELECT NAME,BIRTHDATE FROM CATS") .setResultTra
关于无主键的数据表配置hibernate实体类
    今天在做项目时,遇到了一个没有主键Id的数据表,需要配置对应的Hibernate配置文件,用于底层数据处理。     首先,根据Hibernate的管理配合表的处理机制,需要对配置的文件数据进行唯一标识,这样正常来说直接使用对应数据表的主键作为这个标记字段如:                  也可以使用数据表中其他,带有唯一性的字段作为标记字段,如:Id Card ;    对于没有主键...
文章热词 设计制作学习 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 如果学习java 如果学习区块链