`
alex.Lin
  • 浏览: 65840 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JAVAEE容器如何管理EntityManager和PersistenceContext

    博客分类:
  • java
阅读更多

by linxh  小猪商队(QQ:124157155)

 

EJB3.0---JPA1.0

 

容器托管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
		//4个结果是不一样的
		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
		//4个结果是不一样的,但是其值分别对应UserDao1打印的4个值

		
		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());
			//context1和context2指向的是同一个PersistenceContext实例
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}

}

 

 

推荐阅读

 

代码之余轻松一下:当前热门-人民的名义

jWebSocket使用指南

3
1
分享到:
评论

相关推荐

    几种常见的JavaEE Web容器集群技术比较

    在JavaEE应用开发中,Web容器是至关重要的组成部分,它负责管理Servlet、JSP和JavaBean等组件,为应用程序提供运行环境。而当系统需要处理大量并发请求或提高可用性时,Web容器的集群技术就显得尤为重要。本文将对几...

    javaEE人员管理系统

    《JavaEE人员管理系统详解》 JavaEE人员管理系统是一款利用Java技术栈,基于MySQL数据库开发的高效、简洁的企业级应用。该系统充分利用了Spring、MyBatis两大主流框架,结合JSP进行前端展示,实现了对组织内部人力...

    javaEE雇员管理系统

    JavaEE平台基于JavaSE(Java Standard Edition)之上,提供了丰富的API和服务器容器,如Java Servlet、JSP(JavaServer Pages)、EJB(Enterprise JavaBeans)等,这些都为开发高效、可扩展和安全的Web应用程序提供...

    JavaEE图书管理系统(实训作业)

    【JavaEE图书管理系统(实训作业)】是一个基于JavaEE技术平台开发的应用程序,主要用于管理和维护图书馆的各类资源。这个系统不仅具有美观的用户界面,而且是新手学习JavaEE开发的一个理想实例,尤其适用于那些正在...

    JavaEE课程设计:票据管理系统源码.zip

    JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统...

    JavaEE-图书管理系统.zip

    5. **安全与会话管理**:对于用户登录、权限控制,系统可能会使用容器提供的安全管理机制,如JASPIC(Java Authentication and Authorization Service for Containers)和Servlet API中的Session管理。这确保了只有...

    JAVAEE仓库管理系统

    本次我们将讨论一个基于JAVAEE的仓库管理系统,它是一个实现了基本功能的参考和学习项目。 **系统架构与技术栈** 1. **三层架构**:该仓库管理系统通常采用经典的MVC(Model-View-Controller)模式设计,分为表现...

    javaEE健康管理系统.zip

    它集成了视频教程、论文、PPT、开题报告、任务书以及外文文献翻译等多方面的资源,旨在提供一个全面的学习与实践平台,帮助开发者深入理解和应用JavaEE技术于健康信息管理领域。 一、JavaEE技术基础 JavaEE,全称...

    基于JAVAEE的学生管理系统

    【基于JAVAEE的学生管理系统】是一种使用JAVA企业版(JAVAEE)技术栈开发的教育信息化解决方案。JAVAEE,全称为Java Platform, Enterprise Edition,是Oracle公司提供的一个用于构建企业级分布式应用的标准框架。它...

    基于javaEE网上商城管理系统

    总的来说,基于JavaEE的网上商城管理系统是一个集成了用户服务、商品管理、订单处理、售后服务和数据分析等多方面功能的综合性平台。通过合理的设计和实现,该系统能够有效地提升电子商务运营效率,为商家和消费者...

    javaEE 的图书管理系统

    JavaEE的图书管理系统是一个基于Java企业级开发技术的软件应用,用于实现图书馆的日常...以上就是基于JavaEE的图书管理系统可能涉及的一些核心技术和知识点,每个点都值得深入研究和实践,以提升开发效率和软件质量。

    javaee学生管理系统,教务管理系统,用了mysql,easyui,jquery,

    JavaEE学生管理系统与教务管理系统的实现主要基于一系列先进的技术和工具,其中包括MySQL数据库、EasyUI前端框架以及jQuery库。在本文中,我们将深入探讨这些关键组件及其在系统开发中的作用。 首先,JavaEE(Java ...

    javaee学院管理系统

    【JavaEE学院管理系统】是一个基于Java技术开发的教育管理软件,用于高效地管理和组织学院的各项事务。这个系统可能包括学生管理、课程管理、教师管理、成绩管理等多个模块,旨在提高学院的工作效率,优化教育资源...

    javaee 宿舍管理系统

    JavaEE 宿舍管理系统是一种基于Java企业版(JavaEE)技术构建的...以上就是JavaEE宿舍管理系统开发中涉及的主要技术点,每个知识点都包含丰富的理论和实践内容,需要开发者具备扎实的Java基础和良好的软件工程思维。

    javaee大作业学籍管理系统

    【JavaEE大作业学籍管理系统】是一个基于JavaEE技术平台开发的学生信息管理应用,它主要用于高校或教育机构进行学生学籍信息的录入、查询、修改和管理。在本项目中,我们将探讨JavaEE架构下的核心技术和实现细节。 ...

    javaEE供销管理系统.rar

    JavaEE供销管理系统是一款基于Web的业务应用,主要利用了Java企业版(JavaEE)的先进技术栈,包括JSP(JavaServer Pages)、Struts框架和Hibernate持久化框架,为实现高效、可靠的采购管理提供了完整的解决方案。...

    基于JAVAEE的商品信息管理系统

    "基于JAVAEE的商品信息管理系统"是一个使用JavaEE技术栈开发的Web应用,旨在实现对商品信息的高效管理和展示。这个系统的核心目标是提供一个平台,允许用户通过网页界面执行商品数据的基本操作,如添加、删除、修改...

    javaee用户管理系统(ssm+mybatis+mysql)

    **Spring框架** 是JavaEE开发中的核心组件,它负责管理应用程序的各个组件,如bean的创建、依赖注入等,简化了代码的维护和测试。Spring MVC作为Spring框架的一部分,专门用于处理Web请求,通过模型-视图-控制器...

    JavaEE-人事管理系统

    总的来说,JavaEE-人事管理系统是企业提升人力资源管理水平的重要工具,它通过规范化的流程和便捷的操作,使人事管理工作更加高效、准确。借助先进的开发技术和工具,开发者可以快速构建出稳定、可靠的系统,满足...

Global site tag (gtag.js) - Google Analytics