JAVAEE容器如何管理EntityManager和PersistenceContext
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相关推荐
- WebSocket在容器化管理平台的应用
介绍 Websocket是一个持久化协议,相对于HTTP这种非持久协议而言.它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的,与HTTP一样基于已建立的TCP连接来传 ...
- Docker安装与镜像,容器命令管理
docker和容器的关系 -Docker是完整的一套容器管理系统 -Docker提供了一组命令, 让用户更加方便直接地使用容器技 术,而不需要过多关心底层内核技术 一.Docker的安装 1.配置环境 ...
- 容器日志管理 (2) 开源日志管理方案 ELK/EFK
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.上一篇<容器日志管理(1)>中介绍了Docker自带的logs子命令 ...
- OpenStack推出最新版本Newton,显著提升单一云平台 对虚拟化、裸机和容器的管理...
2016年10月10日-北京- OpenStack社区日前发布其命名为"Newton"的第14个版本.OpenStack是用于构建云的部署最广泛的开源软件.此次推出的新功能包括:I ...
- Spring IOC容器-Bean管理——基于XML方式
Spring IOC容器-Bean管理--基于XML(续集) 1.IOC 操作 Bean 管理(FactoryBean) 1).Spring 有两种类型 bean,一种普通 bean,另外一种工厂 ...
- Kubernetes(K8s) —— 容器编排管理技术
K8s 容器编排管理技术 第一章 是什么 1. 背景 2. 基础概念 Pod 控制器 Service 3. 架构 第二章 环境搭建与安装 1. 虚拟机集群搭建 命令批执行技巧 2. K8s相关软件安装 ...
- 企业容器云管理平台选型指南
作者简介 涂家英,SUSE 资深架构师,专注 Cloud-Native 相关产品和解决方案设计,在企业级云原生平台建设领域拥有丰富的经验. 数字时代下的容器云管理平台 数字时代,市场竞争加剧,业务需求 ...
- 解锁TrueNAS SCALE 三方docker容器网络访问限制,默认是关闭的;并添加Portainer-CE容器webGUI管理器
解锁TrueNAS SCALE 三方docker容器网络访问限制,默认是关闭的:并添加Portainer-CE容器webGUI管理器 本教程环境版本:TrueNAS-SCALE-21.06-BETA. ...
- python容器开发_python学习之容器化管理docker
Docker简介 1.1 什么是虚拟化 在计算机中,虚拟化(英文: Virtualization)是一种资源管理技术,是将计算机的各种实体资源(如: 服 务器.网络.内存及存储等)予以抽象.转化后呈现 ...
最新文章
- 训练大规模语音数据集后的结果分析报告
- md5withrsa java_浏览器运行java插件报错:Algorithm constraints check failed: MD5withRSA
- java 成员函数相互调用_java 深入理解内部类以及之间的调用关系
- java程序设计是选修课_Java程序设计_中国大学 MOOC_章节考试选修课答案
- redhat配置java环境
- 图片循环滚动代码[转]
- maven私服搭建:docker安装Sonatype Nexus以及寻找admin用户对应的随机初始密码
- 黑客帝国 数字雨 屏幕保护程序 linux ubuntu
- 第一次开卡SSD硬盘成功,主控为SM2258XT(附软件)
- Excel怎么将数据数据首尾倒置
- 拉黑和删除的意义一样吗?
- OpenHarmony轻量系统开发【8】其它驱动开发示例
- 将H.264封装为FLV格式
- 十大api接口平台(接口商)
- C# Winform控件贴透明png图片遇到的问题
- Chrome实现独立代理
- spring boot 配置多个Filter过滤器
- 尚硅谷以太坊区块链学习之NFT智能合约(6)
- java核心技术卷I 第1-3章 笔记
- Stones on the Table
热门文章
- python中[x for x in range(n)]列表推导式
- HTML5视频标签 video 的 poster 属性
- 右值引用调用-汇编码分析
- 【uni-app】uni-app实现聊天页面功能——功能篇(下)
- H.265/HEVC视频编码标准总结
- 2021京东Java面试真题:c和java哪个更适合开发游戏
- 基于stm32f103xb处理器的Daplink固件编译
- elementui3
- qt编译quazip静态库_Qt之QuaZip编译-使用教程
- asp.net mvc 项目使用Quartz.net添加定时任务