如何知道是什么让hibernate持久化对象变脏了?

时间:2009-07-16 18:30:38

标签: java hibernate debugging

我用hibernate映射的对象有奇怪的行为。为了知道对象行为奇怪的原因,我需要知道是什么让对象变脏。有人可以帮忙并给我一个暗示吗?

该对象是Java / Spring上下文中的Java类。所以我更喜欢针对Java平台的答案。

编辑:我希望能够访问Hibernate脏状态以及它如何更改附加到会话的对象。我不知道一段代码会如何帮助。

至于实际问题:在由Spring TransactionManager管理的事务中,我对对象执行一些(读取)查询,而不对这些对象进行显式保存,它们由TransactionManager保存,因为Hibernate认为其中一些(和不是全部)都很脏。现在我需要知道为什么Hibernate认为那些对象很脏。

3 个答案:

答案 0 :(得分:7)

我会使用拦截器。 onFlushDirty方法获取当前和之前的状态,以便您可以比较它们。实现Interceptor接口并扩展EmptyInterceptor,覆盖onFlushDirty。然后使用configuration.setInterceptor添加该类的实例(Spring可能要求您以不同方式执行此操作)。您也可以在会话中添加拦截器而不是在启动时。

Here is the documentation on interceptors.

答案 1 :(得分:1)

  1. 创建一个测试用例或类似内容,这样您只需单击即可重现该问题。
  2. 启用org.hibernate的日志记录检查字符串“dirty”的日志记录(实际上你并不需要所有的org.hibernate,但我不知道确切的记录器。
  3. 找到程序中的点,一个实体不脏的地方,一个脏的地方。找到两点之间的代码中间,并在其中放置一个日志语句,用于记录isdirty Value。继续使用策略,直到将代码缩减为一行。
  4. 查看hibernate代码。找到执行脏检查的代码。使用调试器逐步完成它。

答案 2 :(得分:0)

假设无法直接访问对象的状态(例如,没有公共或包受保护的字段)并且没有通过反射进行处理,您可以在所有对象的方法的开头放置一个断点并运行该方案这使得对象在调试器中变脏。