2012-07-27 42 views
0

在JSF,EJB和JPA中創建Web應用程序時,我們有一個意識形態問題。在EJB中的一個會話中存儲同時編輯的實體JSF

我們的例子情況是:

管理員顯示的數據表的用戶列表。接下來,他選擇user1,這導致他進入新的用戶版網站。如果他嘗試打開第二張卡或窗口並在同一會話中選擇user2進行同步編輯,則會出現此問題。 當我們嘗試在編輯後保存user1數據時,它是不可能的,因爲它在端點被user2覆蓋。

數據存儲: 因爲我們沒有在我們的項目的View部分存儲任何數據[下圖可用],所以在顯示它之後,Managed Beans被銷燬。因此,在Controller部分中,我們決定將當前選定的用戶保留爲Endpoint [Stateful EJB Bean]中的字段,該會話由Session Sessiond Managed Bean持有,因此對於會話是不變的。 我們相信我們不應該在Endpoint或Session Scope Managed Bean中存儲任何集合。

問題: 特定情況是對情況的概述。在我們的應用程序中,我們希望在會話期間編輯同一類型的多個實體。

問題: 我們應該在哪裏以及如何存儲用戶/管理員的當前選擇,從而導致該選定實體的版本。

將數據存儲在視圖中,請求作用域部分允許我們控制同一會話中的多個實體,儘管我們認爲這不是合適的方法。但是現在將其存儲在控制器部分中會導致在同一會話中編輯同一類型的一個實體的限制。

框圖位置:http://i.stack.imgur.com/9PyYr.jpg

+0

什麼應用程序服務器和它使用什麼版本? – 2012-07-27 13:59:58

+0

Glassfish 3.1。 它使@AdrianMitev有什麼不同? – Atais 2012-07-27 14:14:51

回答

1

由於您使用的是Java EE服務器(Glassfish的3.1),你可以得到好處使用CDI支持JSF比不同範圍的。有一個名爲CODI的CDI擴展,它提供了所謂的「窗口範圍」,允許您爲每個瀏覽器窗口調整bean的範圍,這將解決您的問題。有關窗口範圍的更多信息可以在here找到。

另一種選擇是使用IceFaces JSF庫,該庫也支持其自己的窗口範圍。更多信息可以發現here

+0

我在此期間發現了類似的解決方案,但對於JBoss,感謝您的鏈接!:) – Atais 2012-07-27 14:25:02

2

因此,您希望獲得的教訓是不要使用會話範圍編輯數據或在頁面之間傳輸數據。

你應該在這裏做的是使用一個GET請求,只需要編輯用戶的ID。然後在編輯頁面上,使用單個視圖範圍的支持bean。

使用這種模式,你不需要額外的擴展。只有當你使用CDI bean作爲支持bean時,你需要CODI,因爲默認的@ViewScoped不幸的不能用於CDI bean。 CODI提供了一個與CDI一起工作的版本。

但是,如果您使用JSF託管的bean,請遵循上面概述的模式,您會沒事的。

+0

GET請求是否是一個最佳解決方案?編輯數據時,我從未在任何公共應用程序中看到任何參數。這就是爲什麼我認爲這很容易,但不建議。 @Mike你經常使用它嗎? – Atais 2012-07-30 09:19:14

+0

這是超高效的,是的,我每天都在使用它;) – 2012-07-31 19:29:42

相關問題