2010-02-27 135 views
4

我在我的Java Web应用程序(JSF1.2,RichFaces)中做了一些“保存”bean功能。它使用JAXB将其转换为XML字符串,然后将其存储在数据库中。如果用户加载它,我想通知用户(bean)内容是否更改,并且应该再次保存。确定Object是否被更改的最佳方法是什么?

我的想法是覆盖hashCode()函数与'org.apache.commons.lang.builder.HashCodeBuilder,但我有很多字段和子元素。 有没有其他办法来处理这种功能?

编辑

“比较” 是在另一个视图完成了!

任何帮助,将不胜感激!

+1

在你去一个基于的hashCode的解决方案的情况下,请记住相应地修改equals()方法。 除此之外,我同意您应该在实例级别添加“修改”标志,确保所有更改都通过setter方法,并修改每个setter,以便如果它接收到与已存储的值不同的值在财产它设置标志。每次写完或重读对象时都要清除它。 – 2010-02-27 09:09:43

回答

5

您可以在bean中添加一个boolean dirty;标志,并将其设置为true,并在重新加载和保存后清除它。

+0

那么,在你的setters和任何其他方法,以任何方式修改任何变量。或者确保你的制定者是唯一的这种方法。 – MatrixFrog 2010-02-27 09:03:28

+0

问题是用户可以提交相同的值,导致调用所有setter方法。 – 2010-02-27 11:51:25

+0

如果setter检查值是否已更改,那么这起作用。仍然有很多冗余代码,但工作。 – 2010-02-27 11:58:22

1

单独依靠hashCode来确定对象是否已更改。也就是说,仅仅因为对象与以前一样具有相同的hashCode,并不意味着它没有被改变。

+0

但让我们假设'hashCode'计算中使用的字段已被更改。比我以前可以依赖的对象具有不同的'hashCode',我不能吗? – 2012-02-10 09:39:14

+0

@BernhardV好问题 - 我也很好奇...... – AgentKnopf 2012-04-27 17:47:59

+0

@ user321068不一定。一个好的散列函数会使对象在修改后不再保留相同的散列码,但这不是一个严格的保证。 – 2017-03-01 05:46:13

-1

您可以使用Java的MD5功能:

MessageDigest digest = java.security.MessageDigest.getInstance("MD5"); 
digest.update(myObject); 
byte[] hash = digest.digest(); 
相关问题