2012-08-01 109 views
0

的狀態,我有以下任務的微小變化。檢測的多個對象

在我工作的應用程序,用戶可以通過多個標籤定義一個相當大的實體。每個選項卡都有一個相應的數據庫表,其中存儲信息以及用於表示它的Java對象。這很方便,因爲它像一個嚮導一樣工作:用戶從一個地方開始並知道他必須完成一些步驟(根據他的選擇而變化),可以隨時停止,並在他想要的時候繼續,將他的步驟存儲在數據庫。定義這個實體後,他可以切換到「運行」模式,在那裏他可以看到他的定義的實時結果。結果往往很多,並分散在多個頁面上。我必須做一個驗證,在導航「運行」頁面期間,併發場景中的其他用戶沒有更改該定義。在這種情況下,應該顯示一條消息並採取一些行動。

我的問題是這樣的。在你看來,最好的辦法是檢查整個定義中的一個方面是否已經改變。我的第一步是創建一個聚合對象,其中包含與選項卡相對應的所有對象,並查詢數據庫或每個對象,以檢查差異。有更好,更快的方法嗎?

回答

2

你可以在每個表中添加一個版本列,並在每次更新行時間遞增版本。如果選項卡中加載的對象版本與數據庫中的版本不匹配,則某人已更新數據。這就是JPA的樂觀鎖定。

+0

是啊,我konw這種方法,但它並沒有對我的情況下工作。在某些情況下,用戶的某些更改不會影響定義的結果(即「運行」結果)。採用這種方法將無法工作。 – sebi 2012-08-01 09:13:05

+0

然後在這些情況下不要增加版本,或在其他地方存儲這些屬性,因爲它們不是定義的一部分。 – 2012-08-01 09:24:13

0

可以用某種實體版本來完成,每一個實體可以有一個屬性IsModified可以當任何屬性的修改(設置)設置爲true。最後在每個實體上檢查這個屬性以決定是否保存。

在這種情況下,你會不會需要和數據庫進行比較。

在.net中的DataTable

對其做雖然行版本,其中行維持行版本類似isModified,是否新款,

+0

我曾想過這個,但很快就拋棄了這個選項。負責閱讀此屬性的函數應在讀取該值後將其設置爲false。這不是很安全。考慮必須讀取值2次,或具有3個或更多用戶的併發方案,其中一個修改定義,另外2個或更多讀取狀態。 – sebi 2012-08-01 09:15:37