zoukankan      html  css  js  c++  java
  • hibernate在分层架构中修改数据(update)时遇到的问题!!

           开发软件: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层:

    /**
    	 * 修改房屋信息
    	 */
    	@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还是托管状态。

  • 相关阅读:
    092、部署Graylog日志系统(2019-05-16 周四)
    091、万能的数据收集器 Fluentd (2019-05-15 周三)
    090、ELK完成部署和使用 (2019-05-13 周二)
    在CentOS7上无人值守安装Zabbix4.2
    089、初探ELK (2019-05-13 周一)
    34、Scrapy 知识总结
    33、豆瓣图书短评
    32、出任爬虫公司CEO(爬取职友网招聘信息)
    31、当当图书榜单爬虫
    30、吃什么不会胖
  • 原文地址:https://www.cnblogs.com/a1111/p/7459772.html
Copyright © 2011-2022 走看看