JPA EntityManager詳解

JPA EntityManager詳解

1.   持久化上下文(Persistence Context

Ø 一個持久化單元(Persistence Unit)就是關於一組Entity類的命名配置。持久化單元是一個靜態的概念。
Ø 一個持久化上下文(Persistence Context)就是一個受管的Entity實例的集合。每個持久化上下文都關聯一個持久化單元,持久化上下文不可能脫離持久化單元獨立存在。持久化上下文中的Entity實例就是相關聯的持久化單元中的若干Entity的實例。持久化上下文是一個動態的概念。
Ø 一個Entity實例處於受管狀態,其實質是:該實例存在於某個持久化上下文中,而且可能被某個EntityManager處理,也由於這個緣由,因此咱們說一個EntityManager管理一個持久化上下文。
Ø 儘管持久化上下文很是重要,可是開發者不直接與之打交道,持久化上下文在應用程序中是透明的,咱們須要經過EntityManager間接管理它。

2.   容器管理的EntityManager(Container-Managed EntityManager)

Ø 經過將@PersistenceContext註解標註在EntityManager類型的字段上,這樣獲得的EntityManager就是容器管理的EntityManager。因爲是容器管理的,因此咱們不須要也不該該顯式關閉注入的EntityManager實例。
Ø 容器管理的EntityManager又細分爲兩種類型:事務範圍(Transaction)的和擴展的(Extended)。
Ø @PersistenceContext未指定type屬性,或者指定爲PersistenContextType.TRANSACTION,則表示該EntityManager是事務範圍的;若指定爲PersistenContextType.EXTENDED的,則表示該EntityManager是擴展的。
Ø 事務範圍:事務範圍的EntityManager是無狀態的,可用在無狀態會話Bean和有狀態會話Bean中。
ü 事務範圍的EntityManager依賴於JTA事務,每次調用EntityManager實例的相關方法時,EntityManager會查看是否有某個持久化上下文與當前事務關聯,若是有,則使用該持久化上下文;若是沒有,則EntityManager將建立一個持久化上下文,並將該持久化上下文與當前事務關聯。當事務結束,則持久化上下文消失。
Ø 擴展的:擴展的EntityManager只能用於有狀態會話Bean
ü 擴展的EntityManager在有狀態會話Bean實例建立的時候建立一個持久化上下文,而且直到該有狀態會話Bean銷燬,則相應的持久化上下文才被移除。
ü 因爲在擴展的EntityManager中,每次方法調用都是使用的相同的持久化上下文,因此前一次方法調用時產生的受管實體在下一個方法訪問時仍然爲受管實體。
相關文章
相關標籤/搜索