`
mxx_1111
  • 浏览: 60595 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    Hibernate之struts2整合hibernate以及MVC分层架构的使用案例hibernate002

    总的来说,本案例旨在帮助开发者了解和掌握在实际项目中如何利用Hibernate和Struts2进行数据操作和业务逻辑处理,以及如何运用MVC分层架构设计。通过实践这个案例,开发者可以提升自己的Java Web开发技能,并对这两...

    Hibernate update问题

    在处理数据更新时,Hibernate提供了多种方法,但同时也可能会遇到一些常见问题。本篇文章将深入探讨Hibernate更新机制及其可能遇到的问题,旨在帮助开发者更好地理解和解决这些问题。 1. **基本更新操作** ...

    Hibernate 使用缓存时,数据同步问题

    本文将深入探讨Hibernate使用缓存时可能遇到的数据同步问题,以及如何有效解决这些问题。 #### Hibernate缓存机制概述 Hibernate提供了两种缓存级别:一级缓存和二级缓存。 - **一级缓存**:存在于Session范围内...

    Hibernate和struts的整合架构中数据持久化技术的应用研究.pdf

    1. **数据持久层的实现**:在数据持久层,需要使用Hibernate框架来创建数据访问对象(DAO)。首先定义实体类(Entity Class),例如管理员(Admin)实体类,并使用注解或XML配置文件来映射实体类和数据库表之间的...

    Hibernate和struts中遇到的问题.doc

    在解决这些问题时,理解Struts的MVC架构和Hibernate的ORM原理至关重要。对于初学者来说,熟悉这两个框架的配置、生命周期和异常处理机制,以及如何调试和排查错误,是非常重要的学习步骤。同时,查阅官方文档、在线...

    Hibernate中大量数据的更新

    然而,在将大量数据插入到数据库时,Hibernate 经常会出现性能和内存溢出问题。本文将讨论使用 Hibernate 批量更新大量数据的方法和技巧。 批量更新的必要性 在实际应用中,我们经常需要将大量数据插入到数据库中...

    hibernate 通用接口架构

    在Java企业级开发中,Hibernate是一个非常流行的持久化框架,它简化了数据库操作,使得开发者可以专注于业务逻辑而不是繁琐的数据存取。"hibernate 通用接口架构"是指利用Hibernate框架,通过设计DAO(Data Access ...

    使用struts+spring+hibernate+Mysql架构的在线订餐系统!!!

    本系统采用的是经典的“Struts+Spring+Hibernate+Mysql”架构,也被称为SSH框架,这是一套广泛应用于Java Web开发的技术栈,具有良好的分层设计和组件化特性。 **Struts** 是一个基于MVC(Model-View-Controller)...

    结合struts和hibernate谈J2EE架构的数据表示.doc

    在J2EE架构中,数据表示的层次分明是保持系统模块化、低耦合和高可维护性的重要原则。本文将结合Struts和Hibernate两大框架,深入探讨在J2EE架构下不同层次的数据表示方法。 首先,Web层是用户交互的界面,其数据...

    javaweb分层架构

    模型对象在业务逻辑处理中被创建、修改和保存,然后将这些更改反映到数据库中。 5. 控制层(Controller):在MVC(Model-View-Controller)架构中,控制器负责接收来自用户的请求,调用相应的业务逻辑,并将结果...

    配置hibernate数据源

    配置Hibernate数据源是一项基础而重要的任务,涉及在Java应用程序中集成和使用Hibernate框架以及MySQL数据库。以下内容旨在详细介绍如何在MyEclipse开发环境中配置Hibernate数据源,同时解释相关概念和步骤。 首先...

    论J2EE中Hibernate+Spring架构及其在OA系统开发中的应用

    ### 论J2EE中Hibernate+Spring架构及其在OA系统开发中的应用 #### 一、引言 近年来,随着互联网技术的迅速发展以及Internet的普及,基于B/S(浏览器/服务器)架构的Web应用因其易用性、通用性和良好的可扩展性等...

    hibernate入门数据简单插入

    在数据插入过程中,通常将一系列操作封装在一次事务中,以确保数据的一致性。 9. **错误处理和日志**:在实际开发中,需要考虑错误处理,比如捕获`HibernateException`,并使用日志记录框架(如Log4j)记录异常信息...

    解决Hibernate对于Date类型的数据返回结果中时分秒不对的问题

    在使用Hibernate进行数据库操作时,有时会遇到一个常见的问题,即当从数据库中查询Date类型的数据并由Hibernate返回时,发现结果中的时分秒部分不正确。这个问题通常源于多个因素,包括日期时间的序列化与反序列化...

    springboot2.0多数据源集成hibernate配置hibernateDaoSupport示例

    在Spring Boot 2.0中,开发人员常常需要处理多种数据源,比如在微服务架构中,不同的服务可能需要连接到不同的数据库。本示例主要介绍如何实现Spring Boot 2.0多数据源的集成,并结合Hibernate进行配置,特别是在DAO...

    Hibernate配置数据源.

    根据描述中的内容,我们可以将Hibernate中配置数据源的方式大致分为三种:直接在Hibernate配置文件中定义、通过外部配置文件指明数据源以及利用现有的容器管理的数据源。 #### 四、配置方法详解 ##### 1. 在...

    SSH CRM 项目Hibernate操作数据字典源码(3)

    在SSH CRM项目中,Hibernate作为持久层框架,用于管理和操作数据字典,是数据库与Java对象之间的一个桥梁。本节将深入探讨SSH CRM项目中Hibernate如何实现数据字典的高效、便捷操作。SSH架构是由Spring、Struts和...

    hibernatetools-Update-4.1.1.Final_2013-12-08_01-06-33-B605.zip

    7. **数据浏览与操作**:可以直接在Eclipse中查看数据库中的数据,进行添加、修改、删除等操作。 8. **部署与配置**:帮助用户配置Hibernate项目,包括SessionFactory的生成,事务管理等。 Eclipse Hibernate ...

    JAVA数据类型与Hibernate的类型映射

    而在Java持久化框架Hibernate中,这些数据类型需要与数据库中的字段类型进行映射,以便正确地存储和检索数据。这篇博客主要探讨了Java数据类型如何与Hibernate的类型映射进行对应。 首先,Java的基本数据类型在...

    spring3+springmvc+jpa+hibernate多数据源

    "spring3+springmvc+jpa+hibernate多数据源"是一个示例项目,它演示了如何在一个应用中集成Spring 3、Spring MVC、JPA 2.0以及Hibernate,以实现对多个数据源的支持。下面将详细介绍这些技术及其集成的关键点。 **...

Global site tag (gtag.js) - Google Analytics