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

先来说说什么是EntityManager。顾名思义。EntityManager是负责管理Entity的对象。它是Java实体对象与数据库交互的中介,它负责管理一组相应的实体。包含这组实体的CRUD操作等。

同一时候。EntityManager也就是实体管理器也负责与持久化上下文进行交互,能够实现对实体不同状态进行转换操作等。

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VubGlkdWFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

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

在具体讲述获取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环境的关系示意图:

我们依据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)。每一个持久化单元可觉得是一个数据源的映射(所谓数据源,可理解为一个数据库,我们可以在应用server中配置多个数据源,同一时候使用不同的PersistenceUnit来映射这些数据源,从而可以非常方便的实现跨越多个数据库之间的事务操作!)

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

最新文章

  1. ExtJS笔记 Field
  2. 获取本机内存使用信息、DataTable占用内存空间
  3. ffmpeg解码视频流
  4. DP总结
  5. 【转】中国正爆发聊天APP大战 未来或影响西方
  6. php 使用 Memcache 例子
  7. Redis 命令 - Connection
  8. UIScrollView的坑--UINavigationController Push后位置变化
  9. QT Windows下生成动态链接库
  10. HttpWebResponse请求状态代码
  11. uploadify的使用
  12. 超市买苹果.py
  13. js-day04--Ajax应用--二级联动
  14. python爬虫 | 一条高效的学习路径
  15. 用友U8年度账结转 常用凭证丢失
  16. day81
  17. 黑马-ssh
  18. windows server 2012 r2 安装IIS失败
  19. centos7下部署elasticSearch集群
  20. Jmeter之线程组详解

热门文章

  1. linux 端口占用查看 netstat -tunpl | grep 6379
  2. 三大UML建模工具Visio、Rational Rose、PowerDesign
  3. openwrt开源系统LUCI配置界面
  4. Netty游戏服务器之五Unity3d登陆消息
  5. 定制你自己的CRF模型
  6. LESS,强大的CSS预处理语言
  7. iOS:CALayer核心动画层
  8. JVM调优思路
  9. HTML5基础知识汇总_(2)自己定义属性及表单新特性
  10. [React] Detect user activity with a custom useIdle React Hook