确定Object是否被更改的最佳方法是什么?
我在我的Java Web应用程序(JSF1.2,RichFaces)中做了一些“保存”bean功能。它使用JAXB将其转换为XML字符串,然后将其存储在数据库中。如果用户加载它,我想通知用户(bean)内容是否更改,并且应该再次保存。确定Object是否被更改的最佳方法是什么?
我的想法是覆盖hashCode()
函数与'org.apache.commons.lang.builder.HashCodeBuilder
,但我有很多字段和子元素。 有没有其他办法来处理这种功能?
编辑
“比较” 是在另一个视图完成了!
任何帮助,将不胜感激!
您可以在bean中添加一个boolean dirty;
标志,并将其设置为true
,并在重新加载和保存后清除它。
那么,在你的setters和任何其他方法,以任何方式修改任何变量。或者确保你的制定者是唯一的这种方法。 – MatrixFrog 2010-02-27 09:03:28
问题是用户可以提交相同的值,导致调用所有setter方法。 – 2010-02-27 11:51:25
如果setter检查值是否已更改,那么这起作用。仍然有很多冗余代码,但工作。 – 2010-02-27 11:58:22
单独依靠hashCode
来确定对象是否已更改。也就是说,仅仅因为对象与以前一样具有相同的hashCode
,并不意味着它没有被改变。
但让我们假设'hashCode'计算中使用的字段已被更改。比我以前可以依赖的对象具有不同的'hashCode',我不能吗? – 2012-02-10 09:39:14
@BernhardV好问题 - 我也很好奇...... – AgentKnopf 2012-04-27 17:47:59
@ user321068不一定。一个好的散列函数会使对象在修改后不再保留相同的散列码,但这不是一个严格的保证。 – 2017-03-01 05:46:13
您可以使用Java的MD5功能:
MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
digest.update(myObject);
byte[] hash = digest.digest();
在你去一个基于的hashCode的解决方案的情况下,请记住相应地修改equals()方法。 除此之外,我同意您应该在实例级别添加“修改”标志,确保所有更改都通过setter方法,并修改每个setter,以便如果它接收到与已存储的值不同的值在财产它设置标志。每次写完或重读对象时都要清除它。 – 2010-02-27 09:09:43