﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-寻找我的礼物-文章分类-Hibernate</title><link>http://www.blogjava.net/hrcdg/category/27037.html</link><description>人生就是在不断洗牌，几年河东，几年河西</description><language>zh-cn</language><lastBuildDate>Fri, 02 Nov 2007 09:13:59 GMT</lastBuildDate><pubDate>Fri, 02 Nov 2007 09:13:59 GMT</pubDate><ttl>60</ttl><item><title>[转]解决a different object with the same identifier value was already associated with the session错误 </title><link>http://www.blogjava.net/hrcdg/articles/157724.html</link><dc:creator>Eric huang</dc:creator><author>Eric huang</author><pubDate>Fri, 02 Nov 2007 04:30:00 GMT</pubDate><guid>http://www.blogjava.net/hrcdg/articles/157724.html</guid><wfw:comment>http://www.blogjava.net/hrcdg/comments/157724.html</wfw:comment><comments>http://www.blogjava.net/hrcdg/articles/157724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hrcdg/comments/commentRss/157724.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hrcdg/services/trackbacks/157724.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><span style="font-size: 12pt">&nbsp;</span><span style="font-size: 14pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;这个错误我一共遇到过两次，一直没有找到很好的解决方案，这个错误产生<br />
<br />
原因相信大家都知道，因为在hibernate中同一个session里面有了两个相同标识<br />
<br />
但是是不同实体，当这时运行saveOrUpdate(object)操作的时候就会报这个错误。<br />
<br />
呵呵，也许你会说，你这么说跟没说没什么区别，我承认，呵呵，我不知道具体<br />
<br />
为什么会产生这个错误，要不然也不会很久都没有解决，现在，给出一个临时的<br />
<br />
解决方案，给向我一样，没有办法找到根源的人一个能够继续执行下去的方法<br />
<br />
（当然是对的，只是不是从产生原因入手）</span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;其实要解决这个问题很简单，只需要进行session.clean()操作就可以解决<br />
<br />
了，但是你在clean操作后面又进行了saveOrUpdate(object)操<span style="font-size: 14pt">作，有可能<br />
<br />
会报出"</span></span><span style="font-size: 14pt"><span style="font-size: 10pt; font-family: 宋体">Found two representations of same collection"</span><span style="font-size: 10pt; font-family: 宋体">，<span style="font-size: 12pt"><span style="font-family: 宋体">我找了很多资料，<br />
<br />
没有什么很好的解释，其中这篇文章帮助最大<br />
<br />
<a href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-509">http://opensource.atlassian.com/projects/hibernate/browse/HHH-509</a>。<br />
</span></span></span></span></span></span><span style="font-size: 10pt; font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 14pt"><span style="font-size: 12pt"><br />
最后通过session.refresh(object)方法就可以解决了，注意，当object不<br />
<br />
是数据库中已有数据的对象的时候，不能使用session.refresh(object)因<br />
<br />
为refresh是从hibernate的session中去重新取object，如果session中没<br />
<br />
有这个对象，则会报错所以当你使用saveOrUpdate(object)之前还需要判<br />
<br />
断一下<br />
</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 14pt"><span style="font-size: 12pt"><br />
&nbsp;&nbsp;&nbsp;&nbsp;当然这个问题最容易解决的办法还是使用Hibernate里面自带的merge()<br />
<br />
方法。不过我始终觉得碰到问题就用这种软件自带的非常用方法<br />
<br />
（和saveOrUpdate()，save(),update()相比）感觉十分不爽。</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 14pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;后来我还发现这种错误经常出现在一对多映射和多对多映射，请大家在<br />
<br />
使用一对多和多对多映射的时候要小心一些</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 14pt"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 12pt; font-family: 宋体">Hibernate </span><span style="font-size: 12pt; font-family: 宋体">疑难异常及处理</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left">
<table style="width: 538px; height: 402px" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td style="border-right: #ece9d8; padding-right: 0.75pt; border-top: #ece9d8; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: #ece9d8; padding-top: 0.75pt; border-bottom: #ece9d8; background-color: transparent">
            <p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 12pt; font-family: 宋体">1</span><span style="font-size: 12pt; font-family: 宋体">、a different object with the same identifier value was already associated with the session。</span></span></span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 12pt">　　错误原因：在hibernate中同一个session里面有了两个相同标识但是是不同实体。</span></span></span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 12pt">　　解决方法一：session.clean()</span></span></span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 12pt">　　PS：如果在clean操作后面又进行了saveOrUpdate(object)等改变数据状态的操作，有可能会报出"Found two representations of same collection"异常。</span></span></span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 12pt">　　解决方法二：session.refresh(object)</span></span></span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 12pt">　　PS：当object不是数据库中已有数据的对象的时候，不能使用session.refresh(object)因为该方法是从hibernate的session中去重新取object，如果session中没有这个对象，则会报错所以当你使用saveOrUpdate(object)之前还需要判断一下。</span></span></span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 12pt">　　解决方法三：session.merge(object)</span></span></span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 12pt">　　PS：Hibernate里面自带的方法，推荐使用。</span></span></span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 12pt; font-family: 宋体">2</span><span style="font-size: 12pt; font-family: 宋体">、Found two representations of same collection</span></span></span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 12pt">　　错误原因：见1。</span></span></span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 12pt">　　解决方法：session.merge(object)</span></span></span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><span style="font-size: 14pt"><span style="font-size: 12pt">以上两中异常经常出现在一对多映射和多对多映射中</span></span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<img src ="http://www.blogjava.net/hrcdg/aggbug/157724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hrcdg/" target="_blank">Eric huang</a> 2007-11-02 12:30 <a href="http://www.blogjava.net/hrcdg/articles/157724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>