检测Java对象是否已被修改?

11
考虑到我有一个标准的Java bean:即它包含了StringListHashMap等成员。我的问题是:检测这样一个对象的实例是否已经从之前/原始状态被修改,最简单的方法是什么? 我想知道这个原因是为了确定在以下情况下我是否应该更新数据库中的对象:(i)没有进行更改,或者(ii)更改已经被撤销。我一直在思考hashCode或byte[]的比较,但似乎行不通。有任何想法吗?

已经有一段时间了 - 也许你可以接受一个答案? - Bohemian
@Larry,想要接受答案吗? - VedantK
4个回答

6
是的,可以做到,并且已经做过了...它被称为Hibernate。只需使用它而不要“重复造轮子”。

1
你能否稍微详细介绍一下它,或提供一个更具体的网站参考? - RaT

4
如果您有设置器,请在设置新值时通知监听器列表。

作为对这个非常古老的线程的补充,以帮助来自Google的其他人:那不起作用,因为“null”更改不会被检测到,例如setString(“newString”)+ setString(oldValue)不会改变任何东西,但是按照您的方法,您会收到一个积极的警报。 - alex
@alex 是的,那有点道理。但这是定义的问题。在你调用 setString("newString") 后,对象的状态肯定已经改变,因此通知侦听器是有效的。也许您想随时保存对象以进行更改?您将来可能会将字符串更改回旧值,这很重要。但不一定要这样做。这是根据您的使用情况而定。 - Thomas Uhrig
好的,对象已经改变了。但是我想到,有些应用程序会在状态已经恢复的情况下通知状态已更改。根据定义,已进行操作,但在所有情况下检测修改并不是逻辑上/实用的。 - alex

3
相同的问题也困扰着“hibernate”开发者,他们通过为返回的实体创建代理来解决这个问题。代理会记录每个setter调用,并判断实体是否已经改变。

2
由于您正在使用JavaBeans约定,最好让您的setter在调用时更新一些标志,如果它们与目标字段的当前值不同,则进行更新。如果您需要找出两个或多个调用是否会导致实际更改(例如A->B->A不会更改),那么它就会变得更加复杂。我不确定这是否值得开销。
您可能希望使用Java Persistance API(JPA),它对这种类型的内容更加适合。它也可以在Java SE应用程序中使用,而不仅仅是在Java EE上下文中使用。在那里使用它需要更多的工作,因为您需要处理事务提交和回滚,但该API将无论如何证明非常有用。

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