2019独角兽企业重金招聘Python工程师标准>>>

      容器托管EntityManager

      @PersistenceContext,存放unitName指向的DataBase对应的EntityBean实例集合,以及对这些实例进行生命周期管理

      @PersistenceContext(
            name="entityManagerName",
            properties=@PersistenceProperty[],
            type=""//PersistenceContextType TRANSACTION (default,transaction- scope) / EXTENDED 
            unitName=""//the persistence unit name
      )

      EntityManager

      必须关联一个PersistenceContext对象,提供一系列方法对PersistenceContext中的EntityBean实例进行操作。

      可以使用依赖注入,将某个PersistenceContext对象注入给EntityManager对象

      如:

      @PersistenceContext(unitName="lxhPU")

      private EntityManager entityManager;

      JAVAEE容器会智能选取容器中的PersistenceContext实例跟这个entityManager实例来关联

      a、一般情况下,一个persistence unit只需对应一个PersistenceContext实例,如 

      class UserDao{
            @PersistenceContext(unitName="lxhPU")
            private EntityManager entityManager;
      }
      class OrderDao{
            @PersistenceContext(unitName="lxhPU")
            private EntityManager entityManager;
      }

      UserDao和OrderDao中的entityManager对象关联的PersistenceContext是同一个实例

      当然,我们也可以手动为PersistenceUnit增加PersistenceContext实例

       class UserDao{
             @PersistenceContext(unitName="lxhPU")
             private EntityManager entityManager;
             @PersistenceContext(name="pc2" ,unitName="lxhPU")
             private EntityManager entityManager2;
       }

      UserDao 中的entityManager和entityManager2关联的2个PersistenceContext实例是不同的,尽管他们指向的是同一个PersistenceUnit

      b、JAVAEE容器会维护PersistenceContext实例及其关联的EntityManger实例

      一个PersistenceContext实例可以被多个EntityManager实例关联

      class UserDao{
            @PersistenceContext(unitName="lxhPU")
            private EntityManager entityManager;
            @PersistenceContext(unitName="lxhPU")
            private EntityManager entityManager2;
      }
      class OrderDao{
            @PersistenceContext(unitName="lxhPU")
            private EntityManager entityManager;
      }

      还是上面的代码:

      UserDao和OrderDao中的entityManager对象关联的PersistenceContext是同一个实例,其实这2个entityManager也是指向容器中的同一个EntityManager实例

      但是UserDao中的entityManager和entityManager2却是不同的EntityManager实例,在同一个类中多次定义,JAVAEE容器会为他们分配不同的EntityManager实例,无则新建,而这2个实例所关联的PersistenceContext对象却是同一个。

     做个简单的测试就一目了然了

     @Stateless
     @Remote
     public class UserDao1 implements IUserDiffEmDao{
          
@PersistenceContext(unitName="lxhPU")
          private EntityManager em;

          @PersistenceContext(unitName="lxhPU")
          private EntityManager em2;

          @PersistenceContext(name="pc3", unitName="lxhPU")
          private EntityManager em3;

          @PersistenceContext(unitName="lxh2PU")
          private EntityManager em4;

          public void test() {
               System.out.println("-----------------------");
               System.out.println("em="+em);//----------------EntityManager@001
               System.out.println("em2="+em2);//----------------EntityManager@002
               System.out.println("em3="+em3);//----------------EntityManager@003
               System.out.println("em4="+em4);//----------------EntityManager@004
               <span style="color: #008000;">//4个结果是不一样的</span>
               return null;
          }
     }

     @Stateless
     @Remote
     public class UserDao2 implements IUserDiffEmDao{
          @PersistenceContext(unitName="lxhPU")
          private EntityManager em;

          @PersistenceContext(unitName="lxhPU")
          private EntityManager em2;

          @PersistenceContext(name="pc3", unitName="lxhPU")
          private EntityManager em3;

          @PersistenceContext(unitName="lxh2PU")
          private EntityManager em4;

          public void test() {
               System.out.println("-----------------------");
               System.out.println("em="+em);//----------------EntityManager@001
               System.out.println("em2="+em2);//----------------EntityManager@002
               System.out.println("em3="+em3);//----------------EntityManager@003
               System.out.println("em4="+em4);//----------------EntityManager@004
               <span style="color: #008000;">//4个结果是不一样的,但是其值分别对应UserDao1打印的4个值</span>
               try {

               PersistenceContext context1 =                                                                                 this.getClass().getDeclaredField("em").getAnnotation(PersistenceContext.class);

          //-----PersistenceContext@001

               PersistenceContext context2 =                                                                               this.getClass().getDeclaredField("em2").getAnnotation(PersistenceContext.class);

          //-----PersistenceContext@001

               PersistenceContext context3 =                                                                               this.getClass().getDeclaredField("em3").getAnnotation(PersistenceContext.class);

          //-----PersistenceContext@002

               PersistenceContext context4 =                                                                               this.getClass().getDeclaredField("em4").getAnnotation(PersistenceContext.class);

          //-----PersistenceContext@003

               System.out.println("UserDao2.context1="+context1.hashCode());
               System.out.println("UserDao2.context2="+context2.hashCode());
               System.out.println("UserDao2.context3="+context3.hashCode());
               System.out.println("UserDao2.context4="+context4.hashCode());
               <span style="color: #008000;">//context1和context2指向的是同一个PersistenceContext实例</span>
               } catch (SecurityException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
               } catch (NoSuchFieldException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
               }
               return null;
          }
     }

转载于:https://my.oschina.net/u/869416/blog/112454

JAVAEE容器如何管理EntityManager和PersistenceContext相关推荐

  1. WebSocket在容器化管理平台的应用

    介绍 Websocket是一个持久化协议,相对于HTTP这种非持久协议而言.它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的,与HTTP一样基于已建立的TCP连接来传 ...

  2. Docker安装与镜像,容器命令管理

    docker和容器的关系 -Docker是完整的一套容器管理系统 -Docker提供了一组命令, 让用户更加方便直接地使用容器技 术,而不需要过多关心底层内核技术 一.Docker的安装 1.配置环境 ...

  3. 容器日志管理 (2) 开源日志管理方案 ELK/EFK

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.上一篇<容器日志管理(1)>中介绍了Docker自带的logs子命令 ...

  4. OpenStack推出最新版本Newton,显著提升单一云平台 对虚拟化、裸机和容器的管理...

    2016年10月10日-北京- OpenStack社区日前发布其命名为"Newton"的第14个版本.OpenStack是用于构建云的部署最广泛的开源软件.此次推出的新功能包括:I ...

  5. Spring IOC容器-Bean管理——基于XML方式

    Spring IOC容器-Bean管理--基于XML(续集) 1.IOC 操作 Bean 管理(FactoryBean) ​ 1).Spring 有两种类型 bean,一种普通 bean,另外一种工厂 ...

  6. Kubernetes(K8s) —— 容器编排管理技术

    K8s 容器编排管理技术 第一章 是什么 1. 背景 2. 基础概念 Pod 控制器 Service 3. 架构 第二章 环境搭建与安装 1. 虚拟机集群搭建 命令批执行技巧 2. K8s相关软件安装 ...

  7. 企业容器云管理平台选型指南

    作者简介 涂家英,SUSE 资深架构师,专注 Cloud-Native 相关产品和解决方案设计,在企业级云原生平台建设领域拥有丰富的经验. 数字时代下的容器云管理平台 数字时代,市场竞争加剧,业务需求 ...

  8. 解锁TrueNAS SCALE 三方docker容器网络访问限制,默认是关闭的;并添加Portainer-CE容器webGUI管理器

    解锁TrueNAS SCALE 三方docker容器网络访问限制,默认是关闭的:并添加Portainer-CE容器webGUI管理器 本教程环境版本:TrueNAS-SCALE-21.06-BETA. ...

  9. python容器开发_python学习之容器化管理docker

    Docker简介 1.1 什么是虚拟化 在计算机中,虚拟化(英文: Virtualization)是一种资源管理技术,是将计算机的各种实体资源(如: 服 务器.网络.内存及存储等)予以抽象.转化后呈现 ...

最新文章

  1. 训练大规模语音数据集后的结果分析报告
  2. md5withrsa java_浏览器运行java插件报错:Algorithm constraints check failed: MD5withRSA
  3. java 成员函数相互调用_java 深入理解内部类以及之间的调用关系
  4. java程序设计是选修课_Java程序设计_中国大学 MOOC_章节考试选修课答案
  5. redhat配置java环境
  6. 图片循环滚动代码[转]
  7. maven私服搭建:docker安装Sonatype Nexus以及寻找admin用户对应的随机初始密码
  8. 黑客帝国 数字雨 屏幕保护程序 linux ubuntu
  9. 第一次开卡SSD硬盘成功,主控为SM2258XT(附软件)
  10. Excel怎么将数据数据首尾倒置
  11. 拉黑和删除的意义一样吗?
  12. OpenHarmony轻量系统开发【8】其它驱动开发示例
  13. 将H.264封装为FLV格式
  14. 十大api接口平台(接口商)
  15. C# Winform控件贴透明png图片遇到的问题
  16. Chrome实现独立代理
  17. spring boot 配置多个Filter过滤器
  18. 尚硅谷以太坊区块链学习之NFT智能合约(6)
  19. java核心技术卷I 第1-3章 笔记
  20. Stones on the Table

热门文章

  1. python中[x for x in range(n)]列表推导式
  2. HTML5视频标签 video 的 poster 属性
  3. 右值引用调用-汇编码分析
  4. 【uni-app】uni-app实现聊天页面功能——功能篇(下)
  5. H.265/HEVC视频编码标准总结
  6. 2021京东Java面试真题:c和java哪个更适合开发游戏
  7. 基于stm32f103xb处理器的Daplink固件编译
  8. elementui3
  9. qt编译quazip静态库_Qt之QuaZip编译-使用教程
  10. asp.net mvc 项目使用Quartz.net添加定时任务