hibernate在分层架构中修改数据(update)时遇到的问题!!
2017-03-08 00:54
288 查看
开发软件: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层:
再看Servlet里面的代码:
原因找到了,但是怎么解决呢?这是个大问题,既然说是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还是托管状态。
数据库: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层:
/** * 修改房屋信息 */ @Override public 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 一对一、多对一 双向关联的问题——只能在多的一方添加、修改数据,不能在多的一方修改添加
- Hibernate数据持久化及update更新问题
- play框架数据修改 - Ebean.update(bean)失败问题解决
- 前台jquery向后台hibernate传数据时遇到的问题
- 微信小程序遇到修改数据后页面不渲染的问题解决
- hibernate使用删除数据时遇到的问题
- C#中DataGridView绑定了DataTable后,通过代码修改DataGridView中的数据,总有一行(被修改过并被用户选中的行集合中索引为0的行)不能被UpDate回数据库的问题和解决办法
- Hibernate的order by遇到null致数据丢失的问题
- 工作中遇到的问题:百万条数据的查询、删除、修改效率提高的一些思考,解决方案(一)
- 用 hibernate 修改数据的奇怪问题。
- 修改已存在数据的表结构可能会遇到的问题:
- 也来说说关于Hibernate使用update更新数据时,不更新的问题
- List.addAll()在Hibernate下update()遇到的问题
- 修改user-agent爬取数据 遇到的问题
- live555Server读取文件修改为socket接收数据遇到的问题
- 工作中遇到的问题:百万条数据的查询、删除、修改效率提高的一些思考,解决方案(二)
- SSH框架之Hibernate一对多关系数据绑值修改删除出现问题
- hibernate保存数据后在修改的时候结果是老数据的问题
- 修改某一字段的数据类型(经常遇到的问题)
- Hibernate3不使用事务无法保存或修改数据问题