容器托管EntityManager less
@PersistenceContext,存放unitName指向的DataBase对应的EntityBean实例集合,以及对这些实例进行生命周期管理 测试
@PersistenceContext(
name="entityManagerName",
properties=@PersistenceProperty[],
type=""//PersistenceContextType TRANSACTION (default,transaction- scope) / EXTENDED
unitName=""//the persistence unit name
) this
EntityManager spa
必须关联一个PersistenceContext对象,提供一系列方法对PersistenceContext中的EntityBean实例进行操做。 .net
能够使用依赖注入,将某个PersistenceContext对象注入给EntityManager对象 对象
如: 生命周期
@PersistenceContext(unitName="lxhPU") get
private EntityManager entityManager; hash
JAVAEE容器会智能选取容器中的PersistenceContext实例跟这个entityManager实例来关联 it
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{UserDao 中的entityManager和entityManager2关联的2个PersistenceContext实例是不一样的,尽管他们指向的是同一个PersistenceUnit
b、JAVAEE容器会维护PersistenceContext实例及其关联的EntityManger实例
一个PersistenceContext实例能够被多个EntityManager实例关联
class UserDao{仍是上面的代码:
UserDao和OrderDao中的entityManager对象关联的PersistenceContext是同一个实例,其实这2个entityManager也是指向容器中的同一个EntityManager实例
可是UserDao中的entityManager和entityManager2倒是不一样的EntityManager实例,在同一个类中屡次定义,JAVAEE容器会为他们分配不一样的EntityManager实例,无则新建,而这2个实例所关联的PersistenceContext对象倒是同一个。
作个简单的测试就一目了然了
@StatelessPersistenceContext 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()); <span style="color: #008000;">//context1和context2指向的是同一个PersistenceContext实例</span> } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }