熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

EJB之JPA(EntityManager)

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


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27196.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.