`
alex.Lin
  • 浏览: 66124 次
  • 性别: 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
分享到:
评论

相关推荐

    javaee5.0 API文档

    例如,@EJB、@WebService和@PersistenceContext等注解用于声明和注入依赖,极大地简化了组件的部署和管理。 其次,EJB 3.0是Java EE 5.0的核心部分,它对原有的EJB规范进行了重大改革。EJB 3.0引入了实体Bean...

    TongWeb6.0应用开发手册.pdf

    - 这些引用在部署描述符中声明,并由容器管理和创建实例。 - **支持资源环境引用(resource-env-ref)**: - 资源环境引用类似于资源引用,但它们引用的是环境条目。 - 这种机制允许组件访问环境条目,而无需显式...

    EJB3.0规范和API文档

    3. **EJB核心规范**: ejb-3_0-fr-spec-ejbcore.pdf可能包含了EJB容器的核心功能,如会话bean、消息驱动bean、实体bean(包括容器管理的持久性 CMP 和Bean管理的持久性 BMT)、以及声明式事务和安全性。 **EJB API**...

    JPA Entity framework, inside of a Glassfish container

    在Glassfish中,JPA操作通常在容器管理的事务(CMT)下运行,这意味着服务器会自动处理事务的开始、提交和回滚。开发者只需编写业务逻辑,无需显式处理事务控制。 此外,JPA还提供了查询语言JPQL(Java Persistence...

    JBoss下EJB3.0实例教程(黎活明)

    - 容器管理事务:EJB容器自动处理事务,开发者无需关心事务的开启、提交和回滚。 2. JBoss与EJB3.0: - JBoss是开源的Java EE应用服务器,完全支持EJB3.0规范。在JBoss环境下部署和运行EJB3.0 bean,可以充分利用...

    达内EJB3.0精典

    `@PersistenceContext`和`@PersistenceUnit`注解用于注入EntityManager和EntityManagerFactory,通过它们可以方便地进行CRUD操作。 3. **实体 Bean**:EJB3.0中的实体Bean(Entity Bean)基于JPA,不再需要Entity ...

    Java全注解式的开发

    Hibernate中,实体类可以通过`@Entity`、`@Table`、`@Id`等注解进行数据映射,甚至可以使用`@PersistenceContext`和`@PersistenceUnit`来注入EntityManager和EntityManagerFactory。 在具体实现过程中,注解能够...

    JPA--HQL查询(手动写原生查询sql,复杂查询必备).pdf

    在 JPA 中,使用 HQL 查询需要先获得 EntityManager,通过 @PersistenceContext 注解可以注入 EntityManager,然后使用 createQuery 方法创建查询对象,最后使用 getResultList 方法获取查询结果。 在 HQL 查询中,...

Global site tag (gtag.js) - Google Analytics