Hibernate更新部分字段淺談

Hibernate更新部分字段淺談

update語句是在Hibernate的Configuration的時候生成的,不能動態改變。爲什麼update的時候所有的屬性都一起update,而不是隻更新改變字段,其實這是一個比較值得探討的問題。

如果想要做到只更新改變了的字段,必須做到兩點:
1、對PO的每個屬性設置version進行狀態跟蹤
2、update語句是動態生成的,在實際向數據庫更新的時候,依次檢查每個屬性的version,決定哪些屬性需要更新,動態構造update語句。

單單要做到上述第一點,就勢必要給PO的操作帶來沉重的負擔,每次屬性的存取都要判斷version,嚴重影響PO的性能。會帶來整個Hibernate性能的降低。而要做到第二點,臨時構造update語句時間消耗很客觀,也會極大降低update的速度。

Hibernate的PO狀態管理是當任何屬性值改變的時候,version就被標記,表明PO被更新了。實現很簡單而有效,效率非常高。而update語句insert,delete和某幾個select語句是在Hibernate初始化過程中就構造好了,不需要用的時候臨時構造。

綜合評價得與失,對PO屬性進行狀態管理固然可以稍微降低數據庫負擔,但是會極大影響Hibernate的運行效率,終究得不償失。

這裏說明一點,如果一個屬性的值變爲空,則hibernate也認爲該屬性的值已經改變,直接update操作就會將空值同步到數據庫中。

以上內容是執行update操作更新改變字段的數據時hibernate的處理。這裏得不出我想要的結果。因爲我的需求有兩點不能忽略:一、我更新的字段,數據不一定改變,這些字段一定要保證數據的同步。二、我不更新的字段,即使數據有變,也不能做同步操作。

 

既然動態設置一個屬性的值是否改變是一件比較難的事情,那就最好轉換一下思路。當然hibernate也有比較折中的方法可以處理。這裏就我總結的,淺談一下。

 

方式一:通過HQL或者SQL來實現。這是最笨拙的方式,具體就是寫HQL或者SQL語句了,我在此就不細說。

 

方式二:一一設置需要更新的字段。首先,重新查詢一次,然後對這個剛查詢出來的對象一一設置需要改變的字段的值,然後再update。這種方式實現起來也是比較讓人痛苦的,跟操作JDBC沒多大區別。

 

方式三:在頁面隱藏不需要改變的值。在修改頁面,隱藏那些無需操作的字段,提交的時候hibernate會自動提交這些隱藏的字段的值。這種方式對於一個多字段的表不太適用。

 

方式四:在方式二的基礎上進行。一一設置需要更新的字段是比較痛苦的,那有沒有工具可以幫助我們處理這樣的操作呢。答案是肯定的。Spring是一款很優秀的框架。它內置的BeanUtils工具類可以輕鬆實現這些功能,而且效率極高。BeanUtils的copyProperties方法進行了重載,其中一個如下:

org.springframework.beans.BeanUtils.copyProperties(source, target, ignoreProperties)

 

其中第一個參數是數據源,第二個參數是目標對象,第三個參數用來過濾哪些屬性不需要進行拷貝,這樣在進行更新時就方便多了。

 

這裏沒有哪一種方式更好,哪一種方式不好,具體場合具體對待吧。如果需要更新的字段遠遠多於需要更新的字段,建議採用方式三或者方式四。如果需要更新的字段就那麼幾個,則可以採用方式一或方式二。
發佈了39 篇原創文章 · 獲贊 11 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章