如何知道是什么让一个Hibernate持久化对象变脏的?

11

我用hibernate映射的一个对象表现出奇怪的行为。为了知道这个对象为什么表现异常,我需要知道是什么让这个对象变脏了。有人可以帮忙提供线索吗?

这个对象是Java/Spring环境中的Java类。因此,我更喜欢针对Java平台的答案。

编辑:我想要访问Hibernate的脏状态以及它在与会话相关联的对象上如何更改。我不知道一段代码怎么会有帮助。

至于实际问题:在由Spring TransactionManager管理的事务中,我对某些对象进行了(读取)查询,并且没有对这些对象进行显式保存,但由于Hibernate认为某些对象已经变脏了(并非全部),所以它们会被TransactionManager保存。现在我需要知道Hibernate为什么认为这些对象是脏的。


一些更详细的错误/问题描述以及一些代码可能会让您获得更好的答案机会。 - jitter
3个回答

7
我会使用拦截器。onFlushDirty方法获取当前和先前状态,因此您可以将它们进行比较。实现Interceptor接口并扩展EmptyInterceptor,覆盖onFlushDirty。然后,使用configuration.setInterceptor添加该类的实例(Spring可能要求您以不同方式执行此操作)。您还可以在会话中添加拦截器,而无需在启动时添加。
这里是有关拦截器的文档(链接)

那并不会告诉你是什么使一个对象变脏,只会告诉你哪些字段是脏的。刷新会在对象状态改变后发生,通常在事务结束时进行。 - Nat

1
  1. 创建一个测试用例或类似的东西,这样你就可以通过单击来重现问题。
  2. 为 org.hibernate 启用日志记录,检查字符串 "dirty" 的日志记录(实际上你不需要所有的 org.hibernate,但我不知道确切的记录器)。
  3. 在程序中找到两个点,一个实体不是脏的,一个实体是脏的。找到两个点之间的代码中间点,并在那里放置一个日志记录语句,以记录 isdirty 值。继续使用该策略,直到将代码减少到一行。
  4. 检查 hibernate 代码。找到执行脏检查的代码。使用调试器逐步执行它。

0
假设对象的状态不能直接访问(例如没有公共或包保护字段),并且不会被反射篡改,您可以在对象的所有方法开始处设置断点,并通过调试器运行使对象变脏的场景。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接