基本概念 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管理着所有的持久化对象的数据而在EJB中EntityManager管理着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> |