JAVAEE容器如何管理EntityManager和PersistenceContext_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > JAVAEE容器如何管理EntityManager和PersistenceContext

JAVAEE容器如何管理EntityManager和PersistenceContext

 2012/3/6 13:51:25  alex.Lin  程序员俱乐部  我要评论(0)
  • 摘要:bylinxh小猪商队(QQ:124157155)EJB3.0---JPA1.0容器托管EntityManager@PersistenceContext,存放unitName指向的DataBase对应的EntityBean实例集合,以及对这些实例进行生命周期管理@PersistenceContext(name="entityManagerName",properties=@PersistenceProperty[]
  • 标签:Java Ten 如何管理

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;
	}

}

?

?

发表评论
用户名: 匿名