基本概念
EntityManager稱為實體管理器
它由EntityManagerFactory所創建
EntityManagerFactory
作為EntityManager的工廠
包含有當前O
R映射的元數據信息
每個EntityManagerFactory
可稱為一個持久化單元(PersistenceUnit)
每個持久化單元可認為是一個數據源的映射(所謂數據源
可理解為一個數據庫
我們可以在應用服務器中配置多個數據源
同時使用不同的PersistenceUnit來映射這些數據源
從而能夠很方便的實現跨越多個數據庫之間的事務操作!)
PersistenceContext
稱為持久化上下文
它一般包含有當前事務范圍內的
被管理的實體對象(Entity)的數據
每個EntityManager
都會跟一個PersistenceContext相關聯
PersistenceContext中存儲的是實體對象的數據
而關系數據庫中存儲的是記錄
EntityManager正是維護這種OR映射的中間者
它可以把數據從數據庫中加載到PersistenceContext中
也可以把數據從PersistenceContext中持久化到數據庫
EntityManager通過Persist
merge
remove
refresh
flush等操作來操縱PersistenceContext與數據庫數據之間的同步!
EntityManager是應用程序操縱持久化數據的接口
它的作用與hibernate session類似
為了能夠在一個請求周期中使用同一個session對象
在hibernate的解決方案中
提出了currentSession的概念
hibernate中的current session
可以跟JTA事務綁定
也可以跟當前線程綁定
在hibernate中
session管理著所有的持久化對象的數據
而在EJB
中
EntityManager管理著PersistenceContext
PersistenceContext正是被管理的持久化對象的集合
在Java EE環境下
一個JTA事務通常會橫跨多個組件的調用(比如多個EJB組件的方法調用)
這些組件需要能夠在單個事務范圍內訪問到同樣的Persistence Context
為了滿足這種情況的需要
當EntityManager被注入或通過jndi被查詢的時候
它的Persistence Context將會在當前事務范圍內自動傳播
引用到同一個Persistence unit的EntityManager將使用同樣的Persistence Context
這可以避免在不同的組件之間傳遞EntityManager引用
通過容器來傳遞PersistenceContext
而不是應用程序自己來傳遞EntityManager
這種方式(由容器管理著PersistenceContext
並負責傳遞到不同的EntityManager)稱為容器管理的實體管理器(Container
Managed EntityManager)
它的生命周期由容器負責管理
有一種不常見的情況是
應用程序自身需要獨立訪問Persistence Context
即每次創建一個EntityManager都會迫使創建一個新的Persistence Context
這些Persistence Context即使在同一個事務范圍內也不會跟其它EntityManager共享!這個創建過程可以由EntityManagerFactory的createEntityManager方法來創建
這被稱為應用管理的實體管理器(application
managed entity manager)
底層事務控制
EntityManager的底層可以使用JTA或RESOURCE_LOCAL類型的事務控制策略
JTA一般在容器環境中使用
而RESOURCE_LOCAL一般在J
SE的環境下使用
比如
在J
SE的環境下
由應用程序自身來創建EntityManagerFactory
並由EntityManagerFactory創建EntityManager
通過EntityManager
getTransaction
begin()方法來開啟事務
commit()方法提交事務等等
這種方式就是RESOURCE_LOCAL的基本使用方法
最常用的就是在容器環境下使用
也就是使用JTA類型的EntityManager
這樣
EntityManager的調用都是在一個外部的JTA事務環境下進行的
Container
Managed EntityManager必須是JTA類型的EntityManager
而Application
Managed EntityManager則既可以是JTA類型的EntityManager
也可以是RESOURCE_LOCAL類型的EntityManager
配置示例
<persistence
unit name=
test
transaction
type=
JTA
>
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27196.html