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; } }
推荐阅读
相关推荐
几种常见的JavaEE Web容器集群技术比较
基于javaEE网上商城管理系统采用了Java语言,基于B/S结构,idea作为本系统的开发工具,数据库采用的是开源MySQL来设计。系统分为前台和后台两个模块。前台包括登录注册、首页、我的订单、我的消息、我的地址、我的...
基于mysql的数据库开发的javaEE 人员管理系统。使用了sping,mybatis框架,功能完整,简洁。
JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统...
javaEE雇员管理系统,运用mysql ,sevlet开发
javaEE健康管理系统毕业设计源代码+论文+教程。 本系统采用Struts2+Hibernate+Spring等技术
JavaEE开发的图书管理系统,美工界面做的很酷,适合新手学习使用,JAVAEE期末实训作业。
javaee学生信息管理系统报告.pdf
JavaEE-图书管理系统,和同学一起写的一个项目,经过老师的验收,得到了不错的分数
本系统采用JAVAEE制作的仓库管理系统,基本功能都已实现,仅供参考和学习
javaee学生管理系统,教务管理系统,用了mysql,easyui,jquery,
javaEE 的图书管理系统 ,用了struts等框架,含数据库sql脚本,是做课程设计非常好的代码
基于JavaEE的物流管理平台研究 基于JavaEE的物流管理平台研究 基于JavaEE的物流管理平台研究 基于JavaEE的物流管理平台研究 基于JavaEE的物流管理平台研究 基于JavaEE的物流管理平台研究 基于JavaEE的物流管理平台...
javaEE健康管理系统,有视频教学,有论文,有ppt,有开题报告,有任务书,有外文翻译
javaee 校友管理系统
基于JAVAEE新闻管理系统(含数据库文件EasyUi+MySql+SSH).zip 大学生课程设计 基于javaee的课程设计 自己大二写的课程设计
javaee 宿舍管理系统
JAVAEE课程设计基于JAVAEE的社团管理系统源码.zipJAVAEE课程设计基于JAVAEE的社团管理系统源码.zipJAVAEE课程设计基于JAVAEE的社团管理系统源码.zipJAVAEE课程设计基于JAVAEE的社团管理系统源码.zipJAVAEE课程设计...
javaee大作业学籍管理系统