JAVAEE容器如何管理EntityManager和PersistenceContext

      容器託管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{
             @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
               <span style="color: #008000;">//4個結果是不同的</span>
               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
               <span style="color: #008000;">//4個結果是不同的,可是其值分別對應UserDao1打印的4個值</span>
               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()); <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; } }
相關文章
相關標籤/搜索