Hibernate错误NonUniqueObjectException的处理办法

转载 2012年03月28日 21:29:04

准备从今天开始收集JavaEE中相关的Exception,并给出解决方案,希望大家有遇到各种类型的异常也跟上来!!!!

 

1.org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.test.sshprj.entity.CstCustomer#111]

 

发生这种异常的原因是在执行修改操作的时候,session管理两个具有相同标识符的持久对象造成的。下面代码详细说明:

  1. @Test  
  2. @Rollback(false)  
  3. //使用spring的Test环境做测试,所以事务由spring自动处理  
  4. public void testAdd() {  
  5.     SysUsers newUser=new SysUsers();    
  6.     newUser.setId(3L);  
  7.     newUser.setUserName("jason");  
  8.     newUser.setPassword("jason");  
  9.     this.update(newUser);  
  10.       
  11. }     
  12. private void update(SysUsers newUser){  
  13.     Session session=this.userdao.getSessionFactory().getCurrentSession();  
  14.     SysUsers user=(SysUsers) session.get(SysUsers.class,3L);          
  15.     newUser.setEmail(user.getEmail());//把未修改的属性设置到脱管对象中   
  16.     newUser.setLastLoginTime(user.getLastLoginTime());  
  17.     session.update(newUser); //修改脱管对象newUser 抛出异常NonUniqueObjectException  
  18. }  
 

解决方案1:修改持久对象,把脱管对象中修改过的属性复制到持久对象中


  1. public void testAdd() {  
  2.     SysUsers newUser=new SysUsers();    
  3.     newUser.setId(3L);  
  4.     newUser.setUserName("jason");  
  5.     newUser.setPassword("jason");  
  6.     this.update(newUser);  
  7.       
  8. }     
  9. private void update(SysUsers newUser){  
  10.     Session session=this.userdao.getSessionFactory().getCurrentSession();  
  11.     SysUsers user=(SysUsers) session.get(SysUsers.class,3L);          
  12.     user.setUserName(newUser.getUserName());  
  13.     user.setPassword(newUser.getPassword());  
  14.     session.update(user);  
  15. }  
 

解决方案2:使用session.merge(newUser)

merge的内部,是把newUser对象的属性拷贝到user对象中,然后再修改user对象

  1. private void update(SysUsers newUser){  
  2.     Session session=this.userdao.getSessionFactory().getCurrentSession();  
  3.     SysUsers user=(SysUsers) session.get(SysUsers.class,3L);          
  4.     newUser.setEmail(user.getEmail());//把未修改的属性设置到脱管对象中   
  5.     newUser.setLastLoginTime(user.getLastLoginTime());  
  6.     session.merge(newUser); //修改脱管对象newUser 抛出异常NonUniqueObjectException  
  7. }  
 

解决方案3:使用session的evict方法,evict会把持久对象从一级缓存中删除掉,这样再修改newUser对象将不会出现问题

  1. private void update(SysUsers newUser){  
  2.     Session session=this.userdao.getSessionFactory().getCurrentSession();  
  3.     SysUsers user=(SysUsers) session.get(SysUsers.class,3L);          
  4.     newUser.setEmail(user.getEmail());//把未修改的属性设置到脱管对象中   
  5.     newUser.setLastLoginTime(user.getLastLoginTime());  
  6.     session.evict(user);  
  7.     session.update(newUser);  
  8. }  
 

 

相关文章推荐

Hibernate错误及解决办法集合

  • 2012年05月17日 16:22
  • 373KB
  • 下载

org.hibernate.NonUniqueObjectException学习

本文源自:http://wdmcln.javaeye.com/blog/154066Exception:a different object with the same identifier valu...

关于org.hibernate.NonUniqueObjectException出现的一种情况,以及解决方法。

先放一下问题: org.hibernate.NonUniqueObjectException: a different object with the same identifier value...

org.hibernate.NonUniqueObjectException

org.springframework.dao.DuplicateKeyException: A different object with the same identifier value was...

org.hibernate.NonUniqueObjectException报错后,从配置文件中的hibernate-inverse与cascade 得到解决问题

今天,在写代码的时候多复制了行代码,即重复对SET对象添加了两次相同的对象,由于调用保存的方法不是自己写的,其中代码只用了一句session.save(object),就保存了关联的SET对象,但Hi...

Hibernate Session篇--org.hibernate.NonUniqueObjectException分析及解决

1 问题描述: 用hibernate做修改和删除的时候,有时候会遇到 org.hibernate.NonUniqueObjectException 异常, a different object w...

hibernate3中出现 could not initialize proxy - no Session 错误的解决办法以及lazy load的介绍

could not initialize proxy - no Session 异常: org.hibernate.LazyInitializationException: could not...

关于使用Hibernate出现的多种常见错误的原因及解决办法

1.使用saveOrUpdate方法update数据表失败。2.无法解析属性。3.所有内容均用单引号括起来,字符串整型数据都需要。4.不能将字符串数据赋值给整型字段,否则会导致sql命令不能正常执行。...

Eclipse Hibernate工具的错误: “Fetching children of Database”解决办法

首先确认一下环境,我的eclipse是3.6.2,即helios,使用的hibernate插件是Hibernate Tools,从jboss的源下载的。 全部错误提示为 java.lang...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate错误NonUniqueObjectException的处理办法
举报原因:
原因补充:

(最多只允许输入30个字)