JAVAEE容器如何管理EntityManager和PersistenceContext

article/2025/9/14 8:39:30

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

      容器托管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


http://chatgpt.dhexx.cn/article/nHtBgqcK.shtml

相关文章

An attempt was made to call the method javax.persistence.PersistenceContext.synchronization()

报错 解决办法 1、 2、 3、 4、 5、 别忘了最后点击 Apply 然后在点击ok 重启完事 6、 如果都不行的话 It was loaded from the following location: 就去这个提示下的位置 把它报错的包删除 从新加载Maven即可&#xff01;&#xff01;

Spring各种注解 @PersistenceContext和@Resource @GetMapping、@PostMapping、@PutMapping、@DeleteMapping

这里记录各种spring注解 DataAllArgsConstructorNoArgsConstructorBuilder Data 使用这个注解&#xff0c;就不用再去手写Getter,Setter,equals,canEqual,hasCode,toString等方法了&#xff0c;注解后在编译时会自动加进去。 AllArgsConstructor 使用后添加一个构造函数&…

SpringDataJPA+Hibernate框架源码剖析(六)@PersistenceContext和@Autowired注入EntityManager的区别

SpringDataJPAHibernate框架源码剖析系列文章&#xff1a; SpringDataJPAHibernate框架源码剖析&#xff08;一&#xff09;框架介绍SpringDataJPAHibernate框架源码剖析&#xff08;二&#xff09;框架整合 之 EntityManagerFactory的构建SpringDataJPAHibernate框架源码剖析…

@PersistenceContext 注解在spring中代理

PersistenceContext private EntityManager em;springBoot 2.x 这里注入的是EntityManager的代理类&#xff0c;注入的代理类是单例的&#xff0c;所以是线程安全的 在调用EntityManager的方法时 其实是调用代理类 SharedEntityManagerInvocationHandler中的invoke方法 在这…

JPA之EntityManager踩坑笔记:更改PersistenceContext

一、原因&#xff1a;项目中配置两个Spring JPA的数据源&#xff0c;使用EntityManager的时候默认是选择第一个&#xff0c;导致查询不到第二个数据源的数据。 二、Spring JPA多数据源怎么使用EntityManager 1. Spring JPA多数据源的配置请查看此文章&#xff1a;SpringData …

Spring Data JPA 之 理解 Persistence Context 的核心概念

21 理解 Persistence Context 的核心概念 21.1 Persistence Context 相关核心概念 21.1.1 EntityManagerFactory 和 Persistence Unit 按照 JPA 协议⾥⾯的定义&#xff1a;persistence unit 是⼀些持久化配置的集合&#xff0c;⾥⾯包含了数据源的配置、EntityManagerFacto…

JPA中为什么EntityManager 的注解要用@PersistenceContext

在使用SpringJPA的时候&#xff0c;看到如下代码 PersistenceContextprivate EntityManager entityManager; 于是就有些好奇&#xff0c;这个PersistenceContext是几个意思&#xff0c;如果是实体注入的话&#xff0c;统一采用 Autowired可以吗&#xff1f;于是上网查了下&am…

web打印时,各种页面样式设置

最近碰到这个问题&#xff0c;我需要将网页打印成PDF文件。Chrome可直接将网页保存&#xff08;打印&#xff09;为PDF&#xff08;无需安装Adobe&#xff09;&#xff0c;但式样跟网页上显示的截然不同。我测试了一下用法&#xff0c;了解了其中的一些原理和解决方法&#xff…

WEB免费打印控件推荐

在WEB系统中&#xff0c;打印的确是个烦人的问题。 要么自己开发打印控件&#xff0c;如果项目时间紧&#xff0c;肯定来不及。 要么购买成熟的打印控件&#xff0c;如果是大项目可以考虑&#xff0c;但如果项目只有几K到1、2W之间&#xff0c;这就麻烦了。 前段时间有机会接…

Web打印的实现方法

目前&#xff0c;在做B/S结构程序开发的时候&#xff0c;最棘手和最令人头疼的问题之一就是Web打印。往往打印出来的效果和自己预期的效果相差甚远&#xff0c;那么怎样才能打印出自己想要的效果呢&#xff1f;本文阐述的方法将解决这一问题&#xff0c;从而使得Web打印变得简单…

简单实用的web打印方案-网页精准打印

在当前这个互联网时代&#xff0c;大部分企业都搭建了自已的平台&#xff0c;通过平台联系客户&#xff0c;与粉丝互动&#xff0c;展示自己的产品。PC网站、APP、手机站、这些平台是企业互联网生态系统的重要基础。在公司平台化、系统化的今天&#xff0c;工作中出现web打印的…

JPrint web打印编辑器及web在线打印,JS打印编辑器

效果图 背景&#xff1a; 电子商务的发展火了一大批网商&#xff0c;每日近2000W的订单需要处理&#xff0c;相应的每天有2000W的订单需要打印。在淘宝卖家服务市场里有很多快递单发货单打印工具&#xff0c;他们使用的是阿里提供的菜鸟打印&#xff08;active&#xff09;组件…

前端web打印

前端打印 一、Vue打印插件 第一种方法&#xff1a;通过npm 安装插件 1&#xff0c;安装 npm install vue-print-nb --save 2&#xff0c;引入 安装好以后在main.js文件中引入 import Print from vue-print-nbVue.use(Print); //注册   3&#xff0c;现在就可以使用了 &…

Web Print打印服务

Web Print打印服务 题目一、安装打印服务二、配置相关的打印机三.配置证书并添加到打印机里1.RouterSrv2.IspSrv提示:若需要单独全套笔记可私信我咨询 题目 Web Print 添加一台虚拟打印机,名称为“CS-Print”,发布到AD域。 客户端们都能够通过访问“https://print.worldski…

JS web打印

11.1 Web打印 Web打印是一种常用的打印方式&#xff0c;其使用方法简单、方便、快捷&#xff0c;在浏览网页的同时就可以实现打印的功能。 实例291 调用IE自身的打印功能实现打印 实例说明 通过JavaScript调用IE自身的打印功能实现打印&#xff0c;这种方法比较简单&#xff…

web打印的最佳方案

web打印的最佳方案 web打印的痛点新的解决方案方案web页面实现源代码&#xff0c;源码打印伺服器demo及原理 web打印的痛点 winform打印的方案比较多&#xff0c;实现也比较容易&#xff0c;而且效果也非常炫&#xff1b;但现在越来越多的系统是web系统&#xff0c;甚至是移动…

前端网页打印window.print()

前言 print作为浏览已经比较成熟的技术可以经常被用来打印页面的部分内容&#xff0c;我们可以在MDN上查看到相关的简单介绍。 一、print()方法 print() 方法用于打印当前窗口的内容。调用 print() 方法会产生一个打印预览弹框&#xff0c;让用户可以设置打印请求。最简单的打…

web打印的几种方案

轉自&#xff1a;http://elf8848.iteye.com/blog/626790 -------------------------------------------一 基于Web的打印方案比较分析--------------------------------   基于web的套打&#xff0c;难度在于要将浏览器中呈现的html&#xff0c;精确地打印到票据中&#xf…

HttpPrinter实现web打印功能

HttpPrinter实现web打印功能 WEB套打可选方案不多&#xff0c;理想的更少&#xff0c;利用免费控件HttpPrinterJavaScript实现精确套打&#xff0c;算是较为经典的选择。这种方案其实比较简单&#xff0c;利用一个htm文件就可以实现模板设计过程&#xff0c;几乎是“空手套”式…

web打印实现几种方法

在工作中出现web打印的情况是非常多的&#xff0c;其实这也是一个比较烦人的问题&#xff0c;这篇博客整理一下关于Web打印的一些方法或者方式。 1. window.print() 这个方法是用来打印网页的&#xff0c;页面上的其他的元素也会被打印处理&#xff0c;在打印的时候页眉页脚是…