开发软件:Myeclipse 10.0

数据库:oracle

开发人员:1111

问题简单描述:修改数据的时候不能正常修改,要么修改不成功,要么报错

nice,下面就来看看怎么解决这个bug的。

首先,我做的是一个租房网站,进去之后显示的是所有的房屋信息,然后可以对相应的房屋信息进行修改和删除:

让图来解释:

接下来我的思路是,当点击修改的时候,会进入修改房屋信息的界面updateHouse.jsp,根据改房屋的id,进行查询,显示在update.jsp的表单里面,然后对其的值进行修改!

到这里都没问题,接下来就开始修改,然后我就改动几个值进行提交:

开始运行,运行到完之后控制台里面报错:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [cn.bdqn.house.entity.House#1085]

行,你说啥就是啥,你说报错我就解决呗,还能怎么样,我就是干这活的。

一看到这错误,,,这啥错啊,没见过,不会在在网上查,网上说是session中有2个oid一样的对象,hibernate不知道该让哪个持久化到库里,说的不假,我确实是根据id进行数据修改的,此时的session里面有两个一模一样的id,先看一下我的代码:

Daoimpl层:

/*** 修改房屋信息*/@Overridepublic Object updateHouse(House house) {tx=session.beginTransaction();try {session.update(house);tx.commit();} catch (HibernateException e) {e.printStackTrace();tx.rollback();}finally{session.clear();}return house;}

再看Servlet里面的代码:

private void updateHouseById(HttpServletRequest request, HttpServletResponse response) throws IOException{Integer houseId=Integer.parseInt(request.getParameter("houseId"));House house=new House();PrintWriter out = response.getWriter();String title=request.getParameter("title");                         //房屋标题Integer typeid=Integer.parseInt(request.getParameter("type_id"));   //房屋类型types.setId(typeid);Integer floorage=Integer.parseInt(request.getParameter("floorage"));//房屋面积Integer price=Integer.parseInt(request.getParameter("price"));      //价格String date=request.getParameter("pubdate");                        //发布日期SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");         Date pubdate=null;try {pubdate = format.parse(date);} catch (ParseException e) {e.printStackTrace();}Integer  district_id=Integer.parseInt(request.getParameter("district_id")); //区县district.setId(district_id);Integer street_id=Integer.parseInt(request.getParameter("street_id"));      //街道street.setId(street_id);String contact=request.getParameter("contact");                             //联系人String description=request.getParameter("description");                     //详细描述//添加当前登录的用户String username=request.getParameter("user");                               //当前的用户users.setName(username);List<Users> usersList=usersService.getUsersIdByName(users);users.setId(usersList.get(0).getId());house.setId(houseId);house.setTitle(title);house.setTypes(types);house.setFloorage(floorage);house.setPrice(price);house.setPubdate(pubdate);house.setStreet(street);house.setContact(contact);house.setDescription(description);house.setUsers(users);Object object=houseService.updateHouse(house);if(object==null){out.print("<script>alert('修改失败,请检查填入信息是否正确!');location.href='houseInfoServlet?tag=updateHouse';</script>");}else {out.print("<script>alert('修改成功!');location.href='houseInfoServlet?tag=guanli';</script>");}

原因找到了,但是怎么解决呢?这是个大问题,既然说是session里面有两个id的话,那我就干掉一个试试管用不管用:

于是,Daoimpl里面的代码就改成了:

接着运行,看看怎么样

呵呵。报错:org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [cn.bdqn.house.entity.House#1085]

于是想,session中有个方法是saveOrUpdate(),存在就修改,不存在就添加,试一下看看怎么样:

运行完一看,还是报错的它,以此分析,house对象里面肯定有值,要不然报的不是这个错。既然哈市报错,那就继续解决,生活就是不断的解决bug,解决一个又出来一个,接着解决!!

那我在创建一个house对象试试看,把这个house直接赋值给新对象,看看会出现什么!

好   继续改:

运行完之后接着给我报同样的错,其实这种方法我本来就绝的不对,报错是自然的,就是想看看。。。。。

既然update   saveOrupdate   都不行,忽然想到最后一种,用merge试试,他也是修改,看看会怎么样:

接着运行,

OK   解决掉了。

下面来看看merge()和update()

以下的内容摘抄自网上: 
  当我们使用update的时候,执行完成后,我们提供的对象A的状态变成持久化状态。 
  但当我们使用merge的时候,执行完成,我们提供的对象A还是脱管状态,hibernate或者new了一个B,或者检索到 一个持久对象B,并把我们提供的对象A的所有的值拷贝到这个B,执行完成后B是持久状态,而我们提供的A还是托管状态。

hibernate在分层架构中修改数据(update)时遇到的问题!!相关推荐

  1. pb 修改数据窗口种指定字段位置_如何在PB数据窗口中修改数据---设置数据窗口的更新属性...

    如何在 PB 数据窗口中修改数据 --- 设置数据窗口的更新属性 数据窗口对象非常强大的原因之一就是能够很容易地修改数据库.当用户修 改了数据窗口中的数据,插入了新的数据行或者删除了数据行以后,只要调 ...

  2. pb 数据窗口更新mysql_如何在PB数据窗口中修改数据---设置数据窗口的更新属性...

    如何在PB数据窗口中修改数据 如何在PB数据窗口中修改数据---设置数据窗口的更新属性 数据窗口对象非常强大的原因之一就是能够很容易地修改数据库.当用户修改了数据窗口中的数据,插入了新的数据行或者删除 ...

  3. 架构师必备,了解分层架构中缓存那点事儿

    戳蓝字"CSDN云计算"关注我们哦! 作者:贺志兵 无论是CDN缓存加速,还是CPU的三级缓存,又或者是在如今互联网时代流量红利所带来的高并发结构客户端,而不得不使用缓存架构.缓存 ...

  4. sql 账号查询一个表勾选那个权限_Spring Cloud微服务架构中的数据权限DataPermision实现方案...

    Spring Cloud微服务架构中的数据权限DataPermision实现方案 一.出现原因 在Spring Cloud的微服务架构中,常见的权限控制除了菜单权限外,还有数据权限DataPermis ...

  5. sql server如何直接在表中修改数据

    之前做项目一直用的是mysql和oracle,最近做的项目中客户使用的是sql server,之前不了解sql server,今天成功安装并且导入了数据库脚本.在做具体操作的时候,有些数据只需很小的修 ...

  6. Java向数据库中插入数据出错时怎么避免插入错误数据

    Java向数据库中插入数据出错时怎么避免插入错误数据 对于初学者,向数据库写数据时,当程序输错,会有错误的数据写入了数据库,这是可以用捕获异常回滚的方法避免这种情况的发生 代码如下: /** 完成增删 ...

  7. mysql 修改表结构方案_MySQL中修改表结构时需要注意的一些地方

    MySql 在修改表结构的时候可能会中断产品的正常运行影响用户体验,甚至更坏的结果,丢失数据.不是所有的数据库管理员.程序员.系统管理员都非常了解Mysql能避免这种情况.DBA会经常碰到这种生产中断 ...

  8. android listview 数据同步,android中ListView数据刷新时的同步方法

    本文实例讲述了android中ListView数据刷新时的同步方法.分享给大家供大家参考.具体实现方法如下: public class Main extends BaseActivity { priv ...

  9. 分层结构的生活例子_分层架构中的服务层-服务层实战

    引言 服务层是在交互的两个层中间又定义了另外一个层,典型的是在表现层和业务逻辑层之间.这个中间层只是实现应用的用例的类集合. 服务和面向服务的出现,使得整个解决方案更有价值.更加成功.与表现层相比,服 ...

最新文章

  1. [译] 沙箱中的间谍 - 可行的 JavaScript 高速缓存区攻击
  2. 学习,学习javascript
  3. Java内功修炼系列一工厂模式
  4. Objective-C 点语法 成员变量的作用域 @property和@synthesize关键字 id类型
  5. 【原创】洛谷 LUOGU P3371 【模板】单源最短路径
  6. C#压缩指定的文件并生成zip文件
  7. 服务器突然c盘的temp文件夹,c盘里突然出了很多TEMP文件?
  8. dos命令远程重启计算机,简单DOS命令实现局域网Windows远程关机
  9. u盘server2012服务器系统安装,如何安装原版Windows server 2012?U盘安装原版Windows server 2012方法...
  10. Qualcomm MSM8916 将开关机动画放置到指定分区做法
  11. [Servlet] HttpServletRequest
  12. 手机怎么做个人简历?多行业简历模板自由选择
  13. maven学习记录:maven专栏简介
  14. 驱动调试-摄像头部分
  15. XGBOOST + LR 模型融合 python 代码
  16. 如何查看网站服务器的地址
  17. 鲁山县蜂蜜峰农李延卿“老骥伏枥,师德为人”---陈帅良
  18. JavaScript设计模式 Item 6 --单例模式Singleton
  19. 网络安全与渗透:信息收集——FOFA,域名信息(六)此生无悔入华夏,男儿何不带吴钩
  20. 中国地图FLASH和JS版本

热门文章

  1. 团体程序设计天梯赛-练习集L1-011 A-B (20分)getline输入
  2. selenium.common.exceptions.WebDriverException: Message: ‘chromedriver‘ executable needs to bein PATH
  3. word List35
  4. 数据结构---邻接表的DFS
  5. ubuntu分解压缩包
  6. Educational Codeforces Round 107 (Rated for Div. 2)
  7. Matlab与线性代数
  8. Cover the Tree(2020多校第二场C)
  9. ybtoj洛谷P3268:圆的异或并(扫描线)
  10. P3911-最小公倍数之和【莫比乌斯反演】