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層:
/*** 修改房屋信息*/@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)时遇到的问题!!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑显示无法加载操作系统,原因是关键系统
- 下一篇: HostWinds vs HostGat