【问题标题】:How to know what made a hibernate persisted object dirty?如何知道是什么让休眠的持久对象变脏了?
【发布时间】:2010-11-11 11:38:00
【问题描述】:

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

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

编辑:我想访问 Hibernate 脏状态以及它如何在附加到会话的对象上发生变化。我不知道一段代码会有什么帮助。

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

【问题讨论】:

  • 对确切错误/问题的进一步描述以及一些代码可能会让您有更好的机会获得答案

标签: java hibernate debugging


【解决方案1】:

假设对象的状态不能直接访问(例如没有公共或包保护字段)并且没有被反射摆弄,您可以在所有对象方法的开头放置一个断点并运行场景这会使调试器中的对象变脏。

【讨论】:

    【解决方案2】:
    1. 创建一个测试用例或类似的,这样您就可以通过单击重现问题。
    2. 为 org.hibernate 启用日志记录检查字符串“dirty”的日志记录(实际上您不需要所有 org.hibernate,但我不知道确切的记录器。
    3. 查找程序中的点,一个实体不脏的地方,一个实体脏的地方。找到两点之间的代码中间,并在此处放置一条日志语句,用于记录 isdirty 值。继续执行该策略,直到您将代码减少到一行。
    4. 查看休眠代码。找到执行脏检查的代码。使用调试器单步调试。

    【讨论】:

      【解决方案3】:

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

      Here is the documentation on interceptors.

      【讨论】:

      • 这不会告诉你是什么只让对象变脏了哪些字段是脏的。刷新发生在对象更改状态之后,通常在事务结束时。
      猜你喜欢
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      相关资源
      最近更新 更多