2012-03-27 131 views
0

我有一個人表和Person.java映射到表。我有一個編輯用戶界面來更改個人記錄的詳細信息。在編輯頁面上,用戶通常每次更改1或2個字段。我正在使用AJAX發送更新調用,並且只想發送已更改的字段。目前發送整個對象。只更改字段的更新表

問題是在後端有關如何僅更新數據庫的更改字段。

UI層僅創建一個Person對象,只更改字段,其餘字段將被初始化。然後將該對象傳遞給DAO以進行持久化。 DAO如何知道哪些字段被更改?未初始化或故意將哪些字段設置爲空以進行更新。目前整個對象來了,所以我更新了所有的列。

+1

這感覺就像一條走下坡路。爲什麼只更新數據庫中的特定字段?如果用戶將數據提交給表示整個對象的表單,則應更新整個對象。如果您逐字段更新,您將如何檢測並處理併發衝突? (例如,兩個用戶幾乎同時更新同一個人的不同字段,從每個用戶的角度來看,整個記錄是正確的,但以這種方式合併時,這是不正確的。) – David 2012-03-27 18:00:27

+0

該記錄具有時間戳記,因此它將採用的併發性。 – 2012-03-28 04:03:48

+0

記錄中的哪個字段的時間戳指示已更新?畢竟,用這種設計,用戶只更新了一些領域,而不是全部。因此,從審計跟蹤的角度來看,您會記錄用戶更新的數據,而用戶並未實際更新數據。 – David 2012-03-28 12:16:34

回答

0

我通常做的是首先從數據庫中獲取其所有字段的對象。然後我更新了我想要的字段,然後將其發送回DAO。無論如何,DAO都會更新整個對象。這樣做,DAO不關心哪一個被更改。 儘管您可能想要添加其他DAO方法,但仍有一些特殊情況。

1

如果您使用ORM(Hibernate)進行持久化,那麼您可以使用hibernate.merge進行選擇性更新。

JDBC的方法: 將對象保留在會話中,該會話用於填充用戶可以編輯的初始值的UI。 當用戶提交更改時,將提交的值與會話中的對象進行比較,並添加到包含字段名稱和新值的映射中。使用此映射來動態創建更新查詢。