开发软件:Myeclipse 10.0
数据库:oracle
开发人员:1111
问题简单描述:修改数据的时候不能正常修改,要么修改不成功,要么报错
nice,下面就来看看怎么解决这个bug的。
首先,我做的是一个租房网站,进去之后显示的是所有的房屋信息,然后可以对相应的房屋信息进行修改和删除:
让图来解释:
![](http://img.blog.csdn.net/20170308000724235?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzQxMzczOTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
接下来我的思路是,当点击修改的时候,会进入修改房屋信息的界面updateHouse.jsp,根据改房屋的id,进行查询,显示在update.jsp的表单里面,然后对其的值进行修改!
![](http://img.blog.csdn.net/20170308000939612)
到这里都没问题,接下来就开始修改,然后我就改动几个值进行提交:
![](http://img.blog.csdn.net/20170308002139722)
开始运行,运行到完之后控制台里面报错:
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里面的代码就改成了:
![](http://img.blog.csdn.net/20170308003614227)
接着运行,看看怎么样
呵呵。报错: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直接赋值给新对象,看看会出现什么!
好 继续改:
![](http://img.blog.csdn.net/20170308004433298)
运行完之后接着给我报同样的错,其实这种方法我本来就绝的不对,报错是自然的,就是想看看。。。。。
既然update saveOrupdate 都不行,忽然想到最后一种,用merge试试,他也是修改,看看会怎么样:
![](http://img.blog.csdn.net/20170308004816675)
接着运行,
![](http://img.blog.csdn.net/20170308004956176)
OK 解决掉了。
下面来看看merge()和update()
以下的内容摘抄自网上:
当我们使用update的时候,执行完成后,我们提供的对象A的状态变成持久化状态。
但当我们使用merge的时候,执行完成,我们提供的对象A还是脱管状态,hibernate或者new了一个B,或者检索到 一个持久对象B,并把我们提供的对象A的所有的值拷贝到这个B,执行完成后B是持久状态,而我们提供的A还是托管状态。
分享到:
相关推荐
总的来说,本案例旨在帮助开发者了解和掌握在实际项目中如何利用Hibernate和Struts2进行数据操作和业务逻辑处理,以及如何运用MVC分层架构设计。通过实践这个案例,开发者可以提升自己的Java Web开发技能,并对这两...
在处理数据更新时,Hibernate提供了多种方法,但同时也可能会遇到一些常见问题。本篇文章将深入探讨Hibernate更新机制及其可能遇到的问题,旨在帮助开发者更好地理解和解决这些问题。 1. **基本更新操作** ...
本文将深入探讨Hibernate使用缓存时可能遇到的数据同步问题,以及如何有效解决这些问题。 #### Hibernate缓存机制概述 Hibernate提供了两种缓存级别:一级缓存和二级缓存。 - **一级缓存**:存在于Session范围内...
1. **数据持久层的实现**:在数据持久层,需要使用Hibernate框架来创建数据访问对象(DAO)。首先定义实体类(Entity Class),例如管理员(Admin)实体类,并使用注解或XML配置文件来映射实体类和数据库表之间的...
在解决这些问题时,理解Struts的MVC架构和Hibernate的ORM原理至关重要。对于初学者来说,熟悉这两个框架的配置、生命周期和异常处理机制,以及如何调试和排查错误,是非常重要的学习步骤。同时,查阅官方文档、在线...
然而,在将大量数据插入到数据库时,Hibernate 经常会出现性能和内存溢出问题。本文将讨论使用 Hibernate 批量更新大量数据的方法和技巧。 批量更新的必要性 在实际应用中,我们经常需要将大量数据插入到数据库中...
在Java企业级开发中,Hibernate是一个非常流行的持久化框架,它简化了数据库操作,使得开发者可以专注于业务逻辑而不是繁琐的数据存取。"hibernate 通用接口架构"是指利用Hibernate框架,通过设计DAO(Data Access ...
本系统采用的是经典的“Struts+Spring+Hibernate+Mysql”架构,也被称为SSH框架,这是一套广泛应用于Java Web开发的技术栈,具有良好的分层设计和组件化特性。 **Struts** 是一个基于MVC(Model-View-Controller)...
在J2EE架构中,数据表示的层次分明是保持系统模块化、低耦合和高可维护性的重要原则。本文将结合Struts和Hibernate两大框架,深入探讨在J2EE架构下不同层次的数据表示方法。 首先,Web层是用户交互的界面,其数据...
模型对象在业务逻辑处理中被创建、修改和保存,然后将这些更改反映到数据库中。 5. 控制层(Controller):在MVC(Model-View-Controller)架构中,控制器负责接收来自用户的请求,调用相应的业务逻辑,并将结果...
配置Hibernate数据源是一项基础而重要的任务,涉及在Java应用程序中集成和使用Hibernate框架以及MySQL数据库。以下内容旨在详细介绍如何在MyEclipse开发环境中配置Hibernate数据源,同时解释相关概念和步骤。 首先...
### 论J2EE中Hibernate+Spring架构及其在OA系统开发中的应用 #### 一、引言 近年来,随着互联网技术的迅速发展以及Internet的普及,基于B/S(浏览器/服务器)架构的Web应用因其易用性、通用性和良好的可扩展性等...
在数据插入过程中,通常将一系列操作封装在一次事务中,以确保数据的一致性。 9. **错误处理和日志**:在实际开发中,需要考虑错误处理,比如捕获`HibernateException`,并使用日志记录框架(如Log4j)记录异常信息...
在使用Hibernate进行数据库操作时,有时会遇到一个常见的问题,即当从数据库中查询Date类型的数据并由Hibernate返回时,发现结果中的时分秒部分不正确。这个问题通常源于多个因素,包括日期时间的序列化与反序列化...
在Spring Boot 2.0中,开发人员常常需要处理多种数据源,比如在微服务架构中,不同的服务可能需要连接到不同的数据库。本示例主要介绍如何实现Spring Boot 2.0多数据源的集成,并结合Hibernate进行配置,特别是在DAO...
根据描述中的内容,我们可以将Hibernate中配置数据源的方式大致分为三种:直接在Hibernate配置文件中定义、通过外部配置文件指明数据源以及利用现有的容器管理的数据源。 #### 四、配置方法详解 ##### 1. 在...
在SSH CRM项目中,Hibernate作为持久层框架,用于管理和操作数据字典,是数据库与Java对象之间的一个桥梁。本节将深入探讨SSH CRM项目中Hibernate如何实现数据字典的高效、便捷操作。SSH架构是由Spring、Struts和...
7. **数据浏览与操作**:可以直接在Eclipse中查看数据库中的数据,进行添加、修改、删除等操作。 8. **部署与配置**:帮助用户配置Hibernate项目,包括SessionFactory的生成,事务管理等。 Eclipse Hibernate ...
而在Java持久化框架Hibernate中,这些数据类型需要与数据库中的字段类型进行映射,以便正确地存储和检索数据。这篇博客主要探讨了Java数据类型如何与Hibernate的类型映射进行对应。 首先,Java的基本数据类型在...
"spring3+springmvc+jpa+hibernate多数据源"是一个示例项目,它演示了如何在一个应用中集成Spring 3、Spring MVC、JPA 2.0以及Hibernate,以实现对多个数据源的支持。下面将详细介绍这些技术及其集成的关键点。 **...