读书人

JAVAEE容器怎么管理EntityManager和Pe

发布时间: 2012-08-30 09:55:54 作者: rapoo

JAVAEE容器如何管理EntityManager和PersistenceContext

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实例,如

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

?

?

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

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

@Stateless@Remotepublic 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@001System.out.println("em2="+em2);//----------------EntityManager@002System.out.println("em3="+em3);//----------------EntityManager@003System.out.println("em4="+em4);//----------------EntityManager@004//4个结果是不一样的return null;}}@Stateless@Remotepublic 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@001System.out.println("em2="+em2);//----------------EntityManager@002System.out.println("em3="+em3);//----------------EntityManager@003System.out.println("em4="+em4);//----------------EntityManager@004//4个结果是不一样的,但是其值分别对应UserDao1打印的4个值try {PersistenceContext context1 = this.getClass().getDeclaredField("em").getAnnotation(PersistenceContext.class);//-----PersistenceContext@001PersistenceContext context2 = this.getClass().getDeclaredField("em2").getAnnotation(PersistenceContext.class);//-----PersistenceContext@001PersistenceContext context3 = this.getClass().getDeclaredField("em3").getAnnotation(PersistenceContext.class);//-----PersistenceContext@002PersistenceContext context4 = this.getClass().getDeclaredField("em4").getAnnotation(PersistenceContext.class);//-----PersistenceContext@003System.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 blocke.printStackTrace();} catch (NoSuchFieldException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}}

?

?

读书人网 >编程

热点推荐