hibernate在分层架构中修改数据(update)时遇到的问题!!

简介: hibernate在分层架构中修改数据(update)时遇到的问题!!

开发软件:Myeclipse 10.0


      数据库:oracle


      开发人员:1111


      问题简单描述:修改数据的时候不能正常修改,要么修改不成功,要么报错


 nice,下面就来看看怎么解决这个bug的。


       首先,我做的是一个租房网站,进去之后显示的是所有的房屋信息,然后可以对相应的房屋信息进行修改和删除:


让图来解释:20170308000724235.png接下来我的思路是,当点击修改的时候,会进入修改房屋信息的界面updateHouse.jsp,根据改房屋的id,进行查询,显示在update.jsp的表单里面,然后对其的值进行修改!

11.png



到这里都没问题,接下来就开始修改,然后我就改动几个值进行提交:

12.png


开始运行,运行到完之后控制台里面报错:


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里面的代码:

1. privateprivate 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里面的代码就改成了:

13.png


接着运行,看看怎么样


呵呵。报错: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(),存在就修改,不存在就添加,试一下看看怎么样:

14.png

运行完一看,还是报错的它,以此分析,house对象里面肯定有值,要不然报的不是这个错。既然哈市报错,那就继续解决,生活就是不断的解决bug,解决一个又出来一个,接着解决!!


    那我在创建一个house对象试试看,把这个house直接赋值给新对象,看看会出现什么!


    好   继续改:


14.png


运行完之后接着给我报同样的错,其实这种方法我本来就绝的不对,报错是自然的,就是想看看。。。。。

   既然update   saveOrupdate   都不行,忽然想到最后一种,用merge试试,他也是修改,看看会怎么样15.png


接着运行,

16.png

OK   解决掉了。


    下面来看看merge()和update()


以下的内容摘抄自网上:

 当我们使用update的时候,执行完成后,我们提供的对象A的状态变成持久化状态。

 但当我们使用merge的时候,执行完成,我们提供的对象A还是脱管状态,hibernate或者new了一个B,或者检索到 一个持久对象B,并把我们提供的对象A的所有的值拷贝到这个B,执行完成后B是持久状态,而我们提供的A还是托管状态。









































20170308000724235.png20170308000724235.png

相关文章
|
4天前
|
存储 分布式计算 数据挖掘
数据架构 ODPS 是什么?
数据架构 ODPS 是什么?
50 7
|
4天前
|
数据采集 搜索推荐 数据管理
数据架构 CDP 是什么?
数据架构 CDP 是什么?
19 2
|
3月前
|
机器学习/深度学习 数据采集 人工智能
揭秘!47页文档拆解苹果智能,从架构、数据到训练和优化
【8月更文挑战第23天】苹果公司发布了一份47页的研究文档,深入解析了其在智能基础语言模型领域的探索与突破。文档揭示了苹果在此领域的雄厚实力,并分享了其独特的混合架构设计,该设计融合了Transformer与RNN的优势,显著提高了模型处理序列数据的效能与表现力。然而,这种架构也带来了诸如权重平衡与资源消耗等挑战。苹果利用海量、多样的高质量数据集训练模型,但确保数据质量及处理噪声仍需克服。此外,苹果采取了自监督与无监督学习相结合的高效训练策略,以增强模型的泛化与稳健性,但仍需解决预训练任务选择及超参数调优等问题。
148 66
|
25天前
|
人工智能 前端开发 JavaScript
前端架构思考 :专注于多框架的并存可能并不是唯一的方向 — 探讨大模型时代前端的分层式微前端架构
随着前端技术的发展,微前端架构成为应对复杂大型应用的流行方案,允许多个团队使用不同技术栈并将其模块化集成。然而,这种设计在高交互性需求的应用中存在局限,如音视频处理、AI集成等。本文探讨了传统微前端架构的不足,并提出了一种新的分层式微前端架构,通过展示层与业务层的分离及基于功能的横向拆分,以更好地适应现代前端需求。
|
1月前
|
JSON 前端开发 Java
Spring Boot框架中的响应与分层解耦架构
在Spring Boot框架中,响应与分层解耦架构是两个核心概念,它们共同促进了应用程序的高效性、可维护性和可扩展性。
50 3
|
1月前
|
存储 前端开发 API
DDD领域驱动设计实战-分层架构
DDD分层架构通过明确各层职责及交互规则,有效降低了层间依赖。其基本原则是每层仅与下方层耦合,分为严格和松散两种形式。架构演进包括传统四层架构与改良版四层架构,后者采用依赖反转设计原则优化基础设施层位置。各层职责分明:用户接口层处理显示与请求;应用层负责服务编排与组合;领域层实现业务逻辑;基础层提供技术基础服务。通过合理设计聚合与依赖关系,DDD支持微服务架构灵活演进,提升系统适应性和可维护性。
|
1月前
|
存储 大数据 数据处理
洞察未来:数据治理中的数据架构新思维
数据治理中的数据架构新思维对于应对未来挑战、提高数据处理效率、加强数据安全与隐私保护以及促进数据驱动的业务创新具有重要意义。企业需要紧跟时代步伐,不断探索和实践新型数据架构,以洞察未来发展趋势,为企业的长远发展奠定坚实基础。
|
2月前
|
存储 搜索推荐 数据库
MarkLogic在微服务架构中的应用:提供服务间通信和数据共享的机制
随着微服务架构的发展,服务间通信和数据共享成为关键挑战。本文介绍MarkLogic数据库在微服务架构中的应用,阐述其多模型支持、索引搜索、事务处理及高可用性等优势,以及如何利用MarkLogic实现数据共享、服务间通信、事件驱动架构和数据分析,提升系统的可伸缩性和可靠性。
43 5
|
2月前
|
Java 数据库连接 API
解锁高效开发秘籍:深入探究 Hibernate 如何优雅处理一对多与多对多关系,让数据映射再无烦恼!
【9月更文挑战第3天】Hibernate 是 Java 领域中最流行的 ORM 框架之一,广泛用于处理实体对象与数据库表之间的映射。尤其在处理复杂关系如一对多和多对多时,Hibernate 提供了丰富的 API 和配置选项。本文通过具体代码示例,展示如何使用 `@OneToMany`、`@JoinColumn`、`@ManyToMany` 和 `@JoinTable` 等注解优雅地实现这些关系,帮助开发者保持代码简洁的同时确保数据一致性。
51 4
|
3月前
|
安全 网络安全 数据安全/隐私保护
云原生技术探索:容器化与微服务架构的实践之路网络安全与信息安全:保护数据的关键策略
【8月更文挑战第28天】本文将深入探讨云原生技术的核心概念,包括容器化和微服务架构。我们将通过实际案例和代码示例,展示如何在云平台上实现高效的应用部署和管理。文章不仅提供理论知识,还包含实操指南,帮助开发者理解并应用这些前沿技术。 【8月更文挑战第28天】在数字化时代,网络安全和信息安全是保护个人和企业数据的前线防御。本文将探讨网络安全漏洞的成因、加密技术的应用以及提升安全意识的重要性。文章旨在通过分析网络安全的薄弱环节,介绍如何利用加密技术和提高用户警觉性来构建更为坚固的数据保护屏障。