调试Hibernate会话/事务错误的好主意?

时间:2011-10-28 18:09:53

标签: hibernate debugging transactions hibernate-session

我现在已经使用了Hibernate一段时间,并已习惯于大多数常见的错误消息。大多数人都直接指出了这个问题,但我一直遇到这个问题:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session

我理解错误(会话有两个具有相同ID的不同对象),但我真的不知道调试代码以找到问题根源的好方法。通常,我查看我正在更改的代码,并查找我加载一个对象并手动创建另一个对象的地方,希望我能在逻辑中找到一个简单的错误。但是,我目前正在处理一个我没写过的代码集,这个代码集并不熟悉,而且没有文档。我能想到的唯一解决方案是逐行浏览代码,希望找到错误。您知道更好的方法来调试此错误吗?

此外,我收到的确切错误来自对saveOrUpdate()的调用,这让我想知道它应该在调用save()时调用update()。有没有办法查看Hibernate在当前Session中用于调试目的的对象?

2 个答案:

答案 0 :(得分:4)

如果分离的实体已有ID,则

saveOrUpdate调用updateupdate然后尝试将给定的分离实体附加到会话。由于您在会话中只能有一个给定实体的实例,如果您已经在会话中加载了实体(使用loadget或查询){{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/)。