【问题标题】:Detect if a Java-object has been modified?检测 Java 对象是否已被修改?
【发布时间】:2011-11-14 15:05:41
【问题描述】:

假设我有一个标准 Java bean:即它包含 StringListHashMap 等成员。

我的问题是:检测此类对象的实例是否已从先前/原始状态修改的最简单方法是什么?

我想知道这一点的原因是,我决定是否应该更新数据库中的对象,以防出现以下情况:(i) 未进行任何更改,或 (ii) 进行了更改但随后反了。

我一直在考虑比较 hashCode 或 byte[],但似乎不起作用。有什么想法吗?

【问题讨论】:

  • 已经有一段时间了-也许您可以接受答案?
  • @Larry,要接受答案吗?

标签: java


【解决方案1】:

是的,它可以完成,并且它已经完成......它被称为hibernate。只需使用它,不要“重新发明轮子”

【讨论】:

  • 您能否提供一些有关它的详细信息或任何网站的更具体参考。
【解决方案2】:

如果您有设置器,如果设置了新值,则通知此设置器中的侦听器列表。

【讨论】:

  • 作为这个非常古老的线程中的补充,以帮助其他来自 Google 的人:这不起作用,因为不会检测到“null”更改,例如setString("newString") + setString(oldValue) 不会改变任何东西,但按照你的方法你会得到一个积极的警报
  • @alex 是的,这在某种程度上是正确的。但这是一个定义问题。在您调用setString("newString") 之后,对象的状态肯定发生了变化,因此通知侦听器是有效的。也许您想在对象更改时保留它?将来您最终会将字符串更改回旧值可能很重要。但它不必。这取决于您的用例。
  • 好的,对象已经改变。但我想到的是,尽管原始状态已经恢复,但某些应用程序确实会通知更改的状态。根据定义,已经进行了操作,但在这种情况下检测所有情况下的修改是不合逻辑的/无用的
【解决方案3】:

hibernate 开发人员也遇到了同样的问题,他们通过为返回的实体创建代理来解决这个问题。代理注册每个 setter 调用,从而确定实体是否已更改。

【讨论】:

    【解决方案4】:

    由于您使用的是 JavaBeans 约定,因此如果您的 setter 使用与目标字段的当前值不同的参数调用它们,那么最好让您的 setter 更新一些标志。如果您需要确定两个或多个调用是否导致实际更改(例如 A->B->A 没有更改),那么它会变得更加复杂。我不确定这是否值得开销。

    您可能想要使用 Java Persistance API (JPA),这对于这类东西来说要好得多。它也可以在 Java EE 上下文之外的普通 Java SE 应用程序中使用。那里需要做更多的工作,因为您需要处理事务提交和回滚,但无论如何 API 都会非常有用。

    【讨论】:

      猜你喜欢
      • 2014-04-29
      • 2016-11-05
      • 1970-01-01
      • 2013-10-27
      • 2016-05-12
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多