org.hibernate.NonUniqueObjectException: A dif…
2018-06-18 01:30:27来源:未知 阅读 ()
昨天在使用hibernate的过程中, 在执行update 某个对象的时候, 出现了这个问题,后来在网上查了下,说原因是:
在同一个session内,如果已经有一个对象已经是持久化状态(load进来等),现在构造一个新的PO,和前一个持久化对象拥有相同的持久化标识(identifier),在update的时候,就会抛这个错误。
然后我检查了下代码,确实是有这个问题:我在前面手工new了一个对象,id也设置进去了, 然后在后面我又做了个经验值区间是否重合的校验,这个校验需要把所有的对象都从数据库里查出来,这样
的话, 在session里就确实出现了两个有相同持久化标识(identifier)的对象了, 后来我在校验的代码逻辑里,改了下, 就是在这个对象校验完之后,我把这个对象移除掉:
加完后,再执行update 后, 就没有这个问题了。
总结下:
什么情况下出现这个问题:
1 User user1 = session.load(1); 2 User user2 = new User(); 3 user2.setId(1);//此时ID和user1一样 4 user2.setUsername("lalala"); 5 session.update(user2);//这里会抛出错误
解决方法:
1.不要重新new一个对象,使用load的对象对他进行更改值。例如上面例子直接对user1操作,最后更新user1
2.如果是hibernate3以上,可以使用session.merge()方法
3.把session中同标识的对象移出(session.evict(user1)),使他成为脱管的状态,然后user2就可以update了。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Tomcat结构
下一篇:Eclipse快捷键
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash