1.RESOURCE_LOCAL事務控制策略模式
將persistence.xml按照以下方式配置,會使用RESOURCE_LOCAL的事務控制策略,在這種策略模式下,應用程序自身要負責建立和管理EntityManager。 spring
<persistence-unit transaction-type="RESOURCE_LOCAL">
這種模式的特色:
- 應用程序自身經過EntityManagerFactory來建立EntityManager
- 建立的EntityManager實例就是一個持久化上下文
- 只能經過@PersistenceUnit註解注入一個EntityManagerFactory,而不能經過@PersistenceContex註解
- 不能經過@PersistenceContex註解關聯到一個RESOURCE_LOCAL類型的持久化單元
- 須要經過EntityTransaction API進行事務的操做,如經過EntityManager.getTransaction.begin()方法開啓事務,經過EntityManager.getTransaction.begin().commit()提交事務
- 每次調用EntityManagerFactory.createEntityManager() 的時候,都會建立一個獨立的EntityManager,一樣也會產生一個獨立的持久化上下文(PersistenceContext)
2.JTA事務控制策略模式
將persistence.xml按照以下方式配置,便是使用JTA的事務控制策略,在這種策略模式下,由容器負責EntityManager的建立和管理。 數據庫
<persistence-unit transaction-type="JTA">
這種模式的特色: spa
- 應用不能經過EntityManagerFactory建立EntityManager,而應該經過容器得到EntityManager
- EntityManager只能經過@PersistenceContex註解進行注入,不能經過@PersistenceUnit註解關聯到一個JTA類型的持久化單元
- 經過容器得到的EntityManger都是一個與JTA實務相關的持久化上下文的引用
- 在同一事務下,每個關聯到相同持久化單元的EntityManger,都會自動得到同一個持久化上下文(PersistenceContext)的引用
- 在JTA事務提交時,持久化上下文(PersistenceContext)會將實體與數據庫同步
3.須要特別說明的一點
若是系統中使用了spring來進行持久化的管理,能夠在RESOURCE_LOCAL模式下經過@PersistenceContext註解注入EntityManager,這種狀況下,spring容器會經過@Transactional註解進行事務管理 code