2011-12-08 86 views
18

我目前在理解JPA的概念時遇到了問題。應用程序vs容器管理實體管理器

我目前使用/開發最近的EclipseLink,Glassfish,Derby數據庫來演示一個項目。

之前,我開發更大的圖片什麼的,我需要絕對的把握如何PersistingUnit工作在不同範圍的條款。

我的Servlet 3.0的一堆,目前保存用戶的相關實體類的對象的request.session(在同一個WAR文件的所有內容)。我目前正在使用應用程序管理的EntityManager使用EntityManagerFactory和UserTransaction注入。它在我自己測試時運行平穩。當兩個人同時訪問相同的實體時,會發生不同版本的實體。如果可能,我想使用託管的bean跨越相同的WAR,相同的持久性單元。

我已閱讀並http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html一堆那些範圍這沒有任何意義可言,我的解釋。

長話短說,應用程序和容器管理的EntityManagers的用法和區別是什麼?

回答

17

當你說應用程序管理的事務時,它意味着你的代碼應該處理事務。簡而言之它意味着:

您致電:

entityManager.getTransaction().begin(); //to start a transaction 

那麼,如果成功,你將確保調用

entityManager.getTranasaction().commit(); //to commit changes to database 

或失敗的情況下,你會請確保調用:

entityManager.getTransaction().rollBack(); 

現在想象一下,你有一個容器,它知道何時調用begin()commit()rollback(),即容器管理的事務。有人代表您處理交易。

你只需要指定。

+0

你是什麼意思?「現在想象一下你有一個容器,誰知道何時調用存儲,提交或回滾,這就是容器管理的事務。有人代表你處理事務。」? –

+0

容器就像Spring,在那裏你配置你的bean,你指定什麼是你的tansaction實體,就像你配置一個實體bean一樣,你指定你的bean爲@Transactional並且你的事務由Spring處理 – mprabhat

+3

我發現了一個反映了什麼的問題我正在尋找 - 「應用程序和容器管理的EntityManagers的用法和區別」,只是爲了發現接受的答案談論了不同的東西 - 容器vs應用程序處理了_transactions_。最重要的是,答案從「當你說應用程序管理的事務」開始,OP沒有說。 – alterfox

11

的容器管理事務(CMT)可以被看作是一種聲明式事務的,在這種情況下,事務管理委託給容器(通常是EJB容器),和許多開發工作可能會被簡化。

如果我們在一個帶有EJB容器的Java EE環境中,我們可以直接使用CMT。

如果我們在Java SE環境或沒有EJB容器的Java EE環境中,我們仍然可以利用CMT,一種方法是使用Spring,它使用AOP來實現聲明式事務管理;另一種方法是使用Guice,它使用PersistFilter來實現聲明式事務。

在CMT,容器(無論EJB容器,Spring或吉斯)會照顧事務傳播的和提交/回滾東西;

應用程序管理的事務(AMT)與CMT的不同之處在於我們需要在代碼中以編程方式處理事務。

+4

好的答案,但不要忘記,每個官方的Java EE環境總是有一個EJB容器。否則,它不能稱爲Java EE(因此Tomcat不是官方的Java EE環境)。而且,在Java EE中,與CMT相反的稱爲BMT; Bean管理事務。 –

+0

非常感謝您對此解答的補充。 – aqingsao