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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

intellij idea 如何一键清除所有断点

intellij idea 如何一键清除所有断点 2017-06-19 11:37:20 yanziit 阅读数 50429更多 分类专栏&#xff1a; idea工具 我之前写了一个百度经验,但是搜不到,现在复制一遍,自己留个记录. 注:此方法适用 intellij idea 2016.2.5版本,其他版本我没用过,暂时不知道 1.在idea左下…

整理下.net分布式系统架构的思路

最近看到有部分招聘信息&#xff0c;要求应聘者说一下分布式系统架构的思路。今天早晨正好有些时间&#xff0c;我也把我们实际在.net方面网站架构的演化路线整理一下&#xff0c;只是我自己的一些想法&#xff0c;欢迎大家批评指正。 首先说明的是.net下开源内容较少&#xff…

SQL注入问题及预防方法

SQL注入问题 sql存在漏洞&#xff0c;会被攻击导致数据泄露 SQL会被拼接 or package com.kuang.lesson02; import com.kuang.lesson02.utils.jdbcUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; …

Java transient关键字使用小记

转载自 Java transient关键字使用小记1. transient的作用及使用方法我们都知道一个对象只要实现了Serilizable接口&#xff0c;这个对象就可以被序列化&#xff0c;java的这种序列化模式为开发者提供了很多便利&#xff0c;我们可以不必关系具体序列化的过程&#xff0c;只要…

mysql sample函数_Oracle SAMPLE 语法应用

Sample抽样函数用于支持数据挖掘。Sample 函数使得数据分析操作在样本数据上进行&#xff0c;而不是在整张表上进行。Sample抽样函数用于支持数据挖掘。Sample 函数使得数据分析操作在样本数据上进行&#xff0c;而不是在整张表上进行。选择10%的记录select * from atest sampl…

docker 买了腾讯服务器后的学习

腾讯云买了 打算用 登录成功后&#xff1a; Last login: Mon Nov 11 13:37:02 2019 from 221.12.17.87 [rootVM_0_13_centos ~]# ip addr #查看ip地址 [rootVM_0_13_centos ~]# uname -r #查看centeros内核版本 docker要求 centeros内核在3.10以上 3.10.0-862.e…

Hibernate中使用Criteria查询及注解——(Dept.java)

Dept.java: 部门表的实体类&#xff1a; package cn.bdqn.hibernate_Criteria.entity;import java.util.HashSet; import java.util.Set;/*** 部门表的实体类* author 1111**/ public class Dept implements java.io.Serializable {// Fieldsprivate Integer deptno;private St…

Connect 2016 白话脱口秀将在B站直播,我们的口号是quot; 微软大法好quot;

今年 Connect 大会的主题是 Big possibilities. Bold technology. 北京时间 11月16日 23&#xff1a;00&#xff0c;Connect();//2016 将开启在线直播&#xff0c;届时红衣主教 Scott Guthrie 和 Scott Hanselman 携众多微软技术大咖将为大家带来超级精彩的主题演讲。丰富的内容…

MySQL(笔记)

数据库总览 有时候查的数据错乱&#xff0c;可以重启MySQL 关系型数据库 ( SQL ) MySQL , Oracle , SQL Server , SQLite , DB2 , …关系型数据库通过外键关联来建立表与表之间的关系 非关系型数据库 ( NOSQL )not only Redis , MongoDB , …非关系型数据库通常指数据以对…

第10章尚硅谷SpringBoot检索

第10章尚硅谷SpringBoot检索 P20、尚硅谷-SpringBoot高级-检索-Elasticsearch简介&安装 P21、尚硅谷-SpringBoot高级-检索-Elasticsearch快速入门 P22、尚硅谷-SpringBoot高级-检索-SpringBoot整合Jest操作ES P23、尚硅谷-SpringBoot高级-检索-整合SpringDataElasticsearch…

python 高维数据_Python数据分析入门|利用NumPy高效处理高维数据

矢量化NumPy数组可以将许多数据处理任务表述为简洁的数组表达式&#xff0c;否则需要编写循环。用数组表达式代替循环的做法&#xff0c;通常被称为矢量化。通常矢量化数组运算要比等价的纯Python方式快上一两个数量级&#xff0c;尤其是各种数值计算。假设我们想要在一组值(网…

Hi Visual Studio for Mac

今晚Connect 2016 , 或者你会兴奋地看到Visual Studio 2017在Docker上调试 &#xff0c; MS SQL on Linux &#xff0c;Azure Functions 还有一堆黑技术....但个人还是十分喜欢一个新产品Visual Studio for Mac 。 八个多月前微软收购了Xamarin, 对于Xamarin 的IDE进行了整合&a…

Python3总结

一、输入输出 &#xff08;1&#xff09;控制台输入 input(promptNone) &#xff08;2&#xff09;控制台输出 print([obj1,...][,sep ][,end\n][,filesys.stdout][,flushFalse])二、数据类型 &#xff08;1&#xff09;整数 class int(x, base10) &#xff08;2&#xff09;浮…

Hibernate中使用Criteria查询及注解——(Emp.java)

Emp.java 员工表的实体类&#xff1a; package cn.bdqn.hibernate_Criteria.entity;import java.util.Date;/*** 员工表的实体类* author Administrator**/ public class Emp implements java.io.Serializable {private Integer empno;private Dept dept;private String ename;…

docker 安装elasticsearch

1.安装jdk $ docker pull openjdk $ docker run -d -it --name myopenjdk openjdk /bin/bash 2.安装elasticsearch docker run -d -p 9200:9200 --name"es" -e ES_JAVA_OPTS"-Xms256m -Xmx256m" elasticsearch:5.6 docker pull elasticsearc…

list 置顶元素_java集合指定元素排序:最前,按照提供的顺序排序?求算法

哈哈哈&#xff0c;不好意思&#xff0c;问了题主那么久...根据我获得需求描述&#xff0c;最后我还是觉得引用新的编程元素来使业务稍微变简单的&#xff0c;我整理到需求应该是&#xff1a;首先给定一个指定关键字的排序&#xff0c;给出一个字符串列表&#xff0c;对列表进行…

Connect 大会的主题 ---微软大法好

今年 Connect 大会的主题是 Big possibilities. Bold technology. 北京时间 11月16日 23&#xff1a;00&#xff0c;Connect();//2016 开始了,红衣主教 Scott Guthrie 和 Scott Hanselman 携众多微软技术大咖将为大家带来超级精彩的主题演讲。Visual Studio 2017在Docker上调试…

Java_io体系之CharArrayReader、CharArrayWriter简介、走进源码及示例——13

转载自 Java_io体系之CharArrayReader、CharArrayWriter简介、走进源码及示例——13一&#xff1a;CharArrayReader 1、类功能简介&#xff1a;字符数组输入流car 、与ByteArrayInputStream相同、用于将自带的内置缓存字符数组中的字符读取到程序中。与ByteArrayInputS…

Hibernate中使用Criteria查询及注解——(Emp.hbm.xml)

Emp.hbm.xml 员工信息表的映射文件 <?xml version"1.0" encoding"utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd&…