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还是托管状态。

  • 相关阅读:
    洛谷 P1508 Likecloud-吃、吃、吃
    Codevs 1158 尼克的任务
    2017.10.6 国庆清北 D6T2 同余方程组
    2017.10.6 国庆清北 D6T1 排序
    2017.10.3 国庆清北 D3T3 解迷游戏
    2017.10.3 国庆清北 D3T2 公交车
    2017.10.3 国庆清北 D3T1 括号序列
    2017.10.4 国庆清北 D4T1 财富
    2017.10.7 国庆清北 D7T2 第k大区间
    2017.10.7 国庆清北 D7T1 计数
  • 原文地址:https://www.cnblogs.com/a1111/p/12816357.html
Copyright © 2011-2022 走看看