我现在已经使用了Hibernate一段时间,并已习惯于大多数常见的错误消息。大多数人都直接指出了这个问题,但我一直遇到这个问题:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session
我理解错误(会话有两个具有相同ID的不同对象),但我真的不知道调试代码以找到问题根源的好方法。通常,我查看我正在更改的代码,并查找我加载一个对象并手动创建另一个对象的地方,希望我能在逻辑中找到一个简单的错误。但是,我目前正在处理一个我没写过的代码集,这个代码集并不熟悉,而且没有文档。我能想到的唯一解决方案是逐行浏览代码,希望找到错误。您知道更好的方法来调试此错误吗?
此外,我收到的确切错误来自对saveOrUpdate()
的调用,这让我想知道它应该在调用save()
时调用update()
。有没有办法查看Hibernate在当前Session中用于调试目的的对象?
答案 0 :(得分:4)
saveOrUpdate
调用update
。 update
然后尝试将给定的分离实体附加到会话。由于您在会话中只能有一个给定实体的实例,如果您已经在会话中加载了实体(使用load
,get
或查询){{1调用,你会得到这个例外。
saveOrUpdate
通常应该是打开会话后要做的第一件事。如果必须在更新之前加载实体,则应使用saveOrUpdate
。我通常更喜欢在所有情况下使用merge
,因为它不易出错。
您可以使用merge
了解会话中的内容。
答案 1 :(得分:1)
您可能还想在Session.Flush函数中设置断点,并检查哪些对象存储在persister中。 Here您可能会找到一些有关如何跟踪会话开放和会话关闭事件的信息 - 您可能需要仔细检查PersistenceContext
对象和SessionImpl
的{{1}}属性事件。
要使用源代码进行调试,您不需要重新编译所有NHibernate源 - 您可以将pdb文件与zip源文件绑定(请查看http://lowleveldesign.wordpress.com/2011/10/02/debugging-nhibernate-prepare-symbol-files/)。