视频网站开发用什么服务器,百度申请qq号免费注册,中国vs菲律宾世预赛,怎么制作海报开发软件#xff1a;Myeclipse 10.0 数据库#xff1a;oracle 开发人员#xff1a;1111 问题简单描述#xff1a;修改数据的时候不能正常修改#xff0c;要么修改不成功#xff0c;要么报错 nice,下面就来看看怎么解决这个bug的。 首先#xff0c;我做的是一个租房网站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) {txsession.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 houseIdInteger.parseInt(request.getParameter(houseId));House housenew House();PrintWriter out response.getWriter();String titlerequest.getParameter(title); //房屋标题Integer typeidInteger.parseInt(request.getParameter(type_id)); //房屋类型types.setId(typeid);Integer floorageInteger.parseInt(request.getParameter(floorage));//房屋面积Integer priceInteger.parseInt(request.getParameter(price)); //价格String daterequest.getParameter(pubdate); //发布日期SimpleDateFormat formatnew SimpleDateFormat(yyyy-MM-dd); Date pubdatenull;try {pubdate format.parse(date);} catch (ParseException e) {e.printStackTrace();}Integer district_idInteger.parseInt(request.getParameter(district_id)); //区县district.setId(district_id);Integer street_idInteger.parseInt(request.getParameter(street_id)); //街道street.setId(street_id);String contactrequest.getParameter(contact); //联系人String descriptionrequest.getParameter(description); //详细描述//添加当前登录的用户String usernamerequest.getParameter(user); //当前的用户users.setName(username);ListUsers usersListusersService.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 objecthouseService.updateHouse(house);if(objectnull){out.print(scriptalert(修改失败请检查填入信息是否正确);location.hrefhouseInfoServlet?tagupdateHouse;/script);}else {out.print(scriptalert(修改成功);location.hrefhouseInfoServlet?tagguanli;/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还是托管状态。