2010-02-27 243 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(); 
相關問題