2014-09-19 209 views
-1

我在我的SpringMVC應用程序中使用休眠JPA。我對這段代碼EntityManager和休眠會話

@PersistenceContext 
    protected EntityManager entityManager; 

現在這個EntityManager的是要住我的應用程序的整個生命對其進行初始化。 EntityManager的hibernate實現 正在封裝一個hibernate會話。如果你願意,你可以打開它。當我們在沒有JPA的情況下使用純粹的hibernate時。我們打開會話完成我們的工作並關閉會話。如果EntityManager在後臺打開時以及關閉時使用hibernate的會話。如果它在應用程序的整個生命週期中保持單一會話不會造成問題,因爲實體不會自動驅逐?它可能導致內存不足的錯誤?

+0

閱讀此:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/orm/jpa/JpaTransactionManager.html – 2014-09-19 13:25:19

回答

0

我會盡量回答所有問題(根據我的經驗和期望),但我敢肯定它真的取決於你是否有JTA事務或UserTransactions工作(又名本地資源的事務):

如果EntityManager在後臺打開時以及關閉時使用hibernate的會話?

對於EntityManager的每個實例,打開一個新的hibernate會話。如果您使用JTA事務,則當事務關閉時(當您的第一個服務bean方法返回時),entityManager會關閉。

如果它在整個應用程序的整個生命週期中保持一個會話將不會 因爲實體不會自動驅逐它會產生問題嗎?它 可能會導致內存不足錯誤?

它不保留單個休眠會話。如果你這樣配置,它將有一個可重用連接池,但是對於每個新創建的bean,它都會生成一個新的實體管理器,並在其後面有一個新的Hibernate會話。

+0

對於事務我只是使用@Transactional註釋。沒有做任何事情,我的應用程序不是很大,只有一個分區工作 – faisalbhagat 2014-09-19 13:59:34

+0

因此,當spring管理事務時,它會在事務完成後關閉會話嗎? – faisalbhagat 2014-09-19 14:06:57

+0

是的,這是JTA的情況。 – 2014-09-19 14:29:08