JPA(二):EntityManager

      上述我们知道什么是JPA了,接下来这篇文章就主要为大家介绍JPA的一个重要内容:EntityManager。任何对实体的操作都是通过它来完成的。

      先来说说什么是EntityManager。顾名思义,EntityManager是负责管理Entity的对象。它是Java实体对象与数据库交互的中介,它负责管理一组对应的实体,包括这组实体的CRUD操作等。同时,EntityManager也就是实体管理器也负责与持久化上下文进行交互,可以实现对实体不同状态进行转换操作等。

      通过一张图,来看一下更加生动形象的看一下EntityManager的作用吧。

JPA(二):EntityManager_第1张图片

      知道什么时候实体管理器了,那么实体管理器从哪里来呢?也就是我们如何创建实体管理器呢?

      在详细讲述获取EntityManager对象之前,读者首先要分清楚两个概念,即JavaEE环境与J2SE环境。

一 、 Java EE环境,包括EJB容器和Web容器。 

      (1)Web容器:只运行Web应用的容器,例如Tomcat就是开源的Web容器,它可以运行JSP、Servlet等。 

      (2)EJB容器:运行在EJB组件的容器,提供EJB组件的状态管理、事务管理、线程管理、远程数据资源访问、连接管理和安全性管理等系统级服务。例如JBoss为EJB容器和Web容器(Web容器是集成了Tomcat)结合。 

      部署在EJB容器中的JAR包都可以认为是运行在EJB容器中。但JBoss中的Web应用,比如war包中的类就不是运行在EJB容器中,而是运行在Web容器中。 

二、 J2SE环境 

      最普通Java运行环境,例如一个HelloWorld的Java程序就是运行在J2SE的环境中,通常使用main入口方法作为程序启动的触发。 

      下图就是JavaEE与J2SE环境的关系示意图:

JPA(二):EntityManager_第2张图片 


      我们根据EntityManager对象的管理方式,可以有以下两种类型的EntityManager。

一、  容器托管的(container-managed)EntityManager对象

      容器托管的EntityManager对象最简单,程序员不需要考虑EntityManager连接的释放,以及事务等复杂的问题,所有这些都交给容器去管理。容器托管的EntityManager对象必须在EJB容器中运行,而不能在Web容器和J2SE的环境中运行。通过注入@PersistenceContext注释来获得 EntityManager对象,其实,这种获得EntityManager对象的方式就是容器托管的。

 

二、 应用托管的(application-managed)EntityManager对象

      应用托管的EntityManager对象,程序员需要手动地控制它的释放和连接、手动地控制事务等。但这种获得应用托管的EntityManager对象的方式,不仅可以在EJB容器中应用,也可以使JPA脱离EJB容器,而与任何的Java环境集成,比如说Web容器、J2SE环境等。所以从某种角度上来说,这种方式是JPA能够独立于EJB环境运 行的基础。

      理想状态下,最好是选用容器托管的EntityManager对象的方式,但在特殊的环境下,还是需要使用应用托管的EntityManager对象这种方式。

正是因为应用托管的EntityManager对象的连接释放、事务控制比较复杂,所以在使用时涉及的相关内容比较多。

 

      两种不同的获取EntityManager方式,其实原理还是一致的。归根到底它都是由EntityManagerFactory所创建。只不过是在由容器托管的EntityManager中,容器替我们创建了EntityManagerFactory;但是由应用托管的EntityManager中,我们需要手动创建EntityManagerFactory。

      作为EntityManager的工厂,EntityManagerFactory包含有当前O-R映射的元数据信息,每个EntityManagerFactory,可称为一个持久化单元(PersistenceUnit),每个持久化单元可认为是一个数据源的映射(所谓数据源,可理解为一个数据库,我们可以在应用服务器中配置多个数据源,同时使用不同的PersistenceUnit来映射这些数据源,从而能够很方便的实现跨越多个数据库之间的事务操作!)


      说道这里,不知道读者朋友对于JPA中的EntityManager获取有些理解了吗?


你可能感兴趣的:(JPA(二):EntityManager)