2013-04-26 32 views
0

所以我正在開發一個webapp,並且Im試圖使用JPA來訪問我的數據庫。我使用EJB從數據庫中獲取實體,但是如果我從EJB獲得另一個實例並對其進行更改,則這些更改不會反映在我的舊實體中。此外,當我嘗試刷新舊的實體時,出現錯誤,指出實體未被管理。我可以設計一個工作,我只是想知道我做錯了什麼?EJB Entity不會從EntityManager刷新

回答

0

好吧,它看起來如下。

EJB + JPA位於EJB容器中。您的Web應用程序位於Web應用程序容器中。這兩個容器都是應用程序服務器的一部分,但它們的通信就像Web Containter只是一個EJB組件客戶端一樣。

因此,基本上,您有典型的客戶端(Web應用程序) - 服務器(EJB + JPA)方案。現在,如果你將實體從EJB帶到客戶端,它不知道服務器上發生的變化 - 這只是客戶端的普通對象(它「忘記」了它的EJB/JPA來源)。這就是爲什麼在Web應用程序中看不到任何更改,即使您正在更改EJB容器中的analogus實體。

您必須手動同步您的客戶端對象和保存在EJB容器中的對象。

第二個問題 - 實體不受管理。當您將實體從客戶端發送到EJB容器時,EJB容器不會對該實體作出任何假設 - 它會將其視爲普通對象。

爲了告訴EJB容器「嘿,看,那個實體不只是一些隨機的對象,它是我要你管理的實體」,你需要在進行任何進一步的操作之前調用該對象的方法EntityManager.merge(entity)方法。

此方法將實體添加到持久性上下文緩存並返回連接到實體管理器會話的對象。

這很重要!您需要修改正確的對象

Object addedToEM = EntityManager.merge(entity) 

如果你想在服務器端的任何更新,則需要修改addedToEM實體(例如見JPA EntityManager: Why use persist() over merge()?良好的解釋)。