2014-01-21 25 views
0

是否有現實世界的應用程序時,你可以3層(UI,業務持久性層)相同的對象之間發送的例子嗎?例如爲了簡單起見,讓它成爲實體bean。在發送到entityManager的其他層實體之前始終(深)克隆?

我的意思是,如果從我的EntityManager和AM getReference()發送給用戶,我是讓用戶能夠編輯它,創造它,並在我的代碼的任何一點不能複製?

是否有任何併發​​或任何已知問題,如果你選擇了這個選項? 這個選項的缺點是什麼?

我知道如果我們包裝對象,這種方式我們可以附加,包裝entites,並可以旅行在一個對象可能responseItem,我們可以附加其他屬性,如髒標誌,但如果我想保持簡單可能嗎?或EntityManagers會搞砸了整個事情? (我覺得他們會和不能處理如分離對象適當所以最好是封裝整個持久性和UI層和深複製它們....)

感謝任何回答。

+0

爲什麼你不能只是em.find()你的實體和em.merge()它稍後堅持UI中所做的更改? – scraatz

+0

,因爲目前它不工作!客戶端看到其他編輯的實體,實體不能隨機合併(entityManager不能看到持久實體和分離的實體之間的差異)。而我只想找到活動標誌是1的位置,所以需要自定義查詢,這也是有點改變的地方。 – czupe

回答

0

我發現在這本書中這樣的回答:Pro JPA 2 Mastering the Java™ Persistence API

我認爲主要的原因是深拷貝實體併發線程存取權限,參照本:

應用程序可能無法直接從訪問實體多線程 而它由持久性上下文管理。應用程序可以選擇 然而,允許在 他們被分離的實體併發訪問。如果它選擇這樣做,那麼通過在實體上編碼的方法來控制同步必須是 。不推薦並行實體 狀態訪問,然而,由於實體模型 並不太適合於並行模式。 這將是 最好簡單複製的實體,複製實體,並傳遞給 其他線程訪問,然後合併的任何更改回爲 持久化上下文時,他們需要被保留