容器託管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; } }