<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    細(xì)心!用心!耐心!

    吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學(xué)業(yè),五六點(diǎn)粗墨,七八筆買賣,九十道人情。

    BlogJava 聯(lián)系 聚合 管理
      1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
    JPA EntityManager詳解(二)
    ★ 提示 ★

    目前JBoss 4.2集成了的Tomcat版本為5.5,但Tomcat 6.0以后的版本中才支持使用注釋,所以如果將本例中Servlet運(yùn)行在JBoss 4.2中,并不能獲得EntityManagerFactory對(duì)象;但在符合J2EE 5.0的服務(wù)器中,這樣運(yùn)行是可以的。

    雖然在目前JBoss 4.2版本中不支持使用注釋,但可以通過(guò)另一種方式來(lái)獲得應(yīng)用托管的EntityManager對(duì)象。代碼如下所示。

    1. public class TestServlet extends HttpServlet { 
    2.  
    3.     private EntityManagerFactory emf; 
    4.  
    5.     public TestServlet() { 
    6.  
    7.         super(); 
    8.  
    9.     } 
    10.  
    11.     public void doGet(HttpServletRequest request, HttpServletResponse response) 
    12.  
    13.             throws ServletException, IOException { 
    14.  
    15.         doPost(request, response); 
    16.  
    17.     } 
    18.  
    19.     public void doPost(HttpServletRequest request, HttpServletResponse response) 
    20.  
    21.             throws ServletException, IOException { 
    22.  
    23.         response.setContentType("text/html"); 
    24.  
    25.         PrintWriter out = response.getWriter(); 
    26.  
    27.         out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional //EN\">"); 
    28.  
    29.         out.println("<HTML>"); 
    30.  
    31.         out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>"); 
    32.  
    33.         out.println("  <BODY>"); 
    34.  
    35.         if (emf != null) { 
    36.  
    37.             /**創(chuàng)建EntityManager 對(duì)象*/ 
    38.  
    39.             EntityManager entityManager = emf.createEntityManager(); 
    40.  
    41.             try { 
    42.  
    43.                 Query query = entityManager 
    44.  
    45.                         .createQuery("SELECT c FROM CustomerEO c"); 
    46.  
    47.                 List<CustomerEO> result = query.getResultList(); 
    48.  
    49.                 for (CustomerEO c : result) { 
    50.  
    51.                     System.out.println(c.getId() + "," + c.getName()); 
    52.  
    53.                 } 
    54.  
    55.             } finally { 
    56.  
    57.                 /**關(guān)閉EntityManager*/ 
    58.  
    59.                 entityManager.close(); 
    60.  
    61.             } 
    62.  
    63.         } 
    64.  
    65.         out.println("  </BODY>"); 
    66.  
    67.         out.println("</HTML>"); 
    68.  
    69.         out.flush(); 
    70.  
    71.         out.close(); 
    72.  
    73.     } 
    74.  
    75.     /**Servlet初始化時(shí),創(chuàng)建EntityManagerFactory 對(duì)象*/ 
    76.  
    77.     public void init() throws ServletException { 
    78.  
    79.         if (emf == null) { 
    80.  
    81.             emf = Persistence.createEntityManagerFactory("jpaUnit"); 
    82.  
    83.         } 
    84.  
    85.     } 
    86.  
    87.     /**Servlet銷毀時(shí),關(guān)閉EntityManagerFactory對(duì)象*/ 
    88.  
    89.     public void destroy() { 
    90.  
    91.         if (emf.isOpen()) 
    92.  
    93.             emf.close(); 
    94.  
    95.     } 
    96.  
    97. } 

    public class TestServlet extends HttpServlet {

    private EntityManagerFactory emf;

    public TestServlet() {

    super();

    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    doPost(request, response);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    response.setContentType("text/html");

    PrintWriter out = response.getWriter();

    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional //EN\">");

    out.println("<HTML>");

    out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");

    out.println("  <BODY>");

    if (emf != null) {

    /**創(chuàng)建EntityManager 對(duì)象*/

    EntityManager entityManager = emf.createEntityManager();

    try {

    Query query = entityManager

    .createQuery("SELECT c FROM CustomerEO c");

    List<CustomerEO> result = query.getResultList();

    for (CustomerEO c : result) {

    System.out.println(c.getId() + "," + c.getName());

    }

    } finally {

    /**關(guān)閉EntityManager*/

    entityManager.close();

    }

    }

    out.println("  </BODY>");

    out.println("</HTML>");

    out.flush();

    out.close();

    }

    /**Servlet初始化時(shí),創(chuàng)建EntityManagerFactory 對(duì)象*/

    public void init() throws ServletException {

    if (emf == null) {

    emf = Persistence.createEntityManagerFactory("jpaUnit");

    }

    }

    /**Servlet銷毀時(shí),關(guān)閉EntityManagerFactory對(duì)象*/

    public void destroy() {

    if (emf.isOpen())

    emf.close();

    }

    }



    使用這種方式創(chuàng)建EntityManagerFactory對(duì)象需要注意以下幾個(gè)問(wèn)題。

    可以看到,這里的EntityManagerFactory對(duì)象不是通過(guò)注入獲得的,而是通過(guò)Persistence類中的靜態(tài)方法createEntityManagerFactory來(lái)創(chuàng)建的。

    — 正因?yàn)镋ntityManagerFactory對(duì)象是手動(dòng)創(chuàng)建的,所以在不再使用時(shí),一定要調(diào)用close()方法手動(dòng)關(guān)閉。

    11.1.4.3  J2SE環(huán)境中獲得

    在J2SE環(huán)境中,獲得應(yīng)用托管的EntityManager對(duì)象只能通過(guò)手動(dòng)創(chuàng)建的方式,而不能使用注釋的方式,與Web容器中不使用注釋的方法相同,都是通過(guò)Persistence類中createEntityManagerFactory來(lái)創(chuàng)建的。

    例如,下面代碼為J2SE環(huán)境中獲得應(yīng)用托管EntityManager對(duì)象的方法。

    1. public class CustomerClient { 
    2.  
    3.     public static void main(String[] args) { 
    4.  
    5.         /** 創(chuàng)建EntityManagerFactory對(duì)象 */ 
    6.  
    7.         EntityManagerFactory emf = Persistence 
    8.  
    9.                 .createEntityManagerFactory("jpaUnit"); 
    10.  
    11.         /** 創(chuàng)建entityManager對(duì)象 */ 
    12.  
    13.         EntityManager entityManager = emf.createEntityManager(); 
    14.  
    15.         Query query = entityManager.createQuery("SELECT c FROM CustomerEO c"); 
    16.  
    17.         List<CustomerEO> result = query.getResultList(); 
    18.  
    19.         for (CustomerEO c : result) { 
    20.  
    21.             System.out.println(c.getId() + "," + c.getName()); 
    22.  
    23.         } 
    24.  
    25.         /** 關(guān)閉entityManager對(duì)象 */ 
    26.  
    27.         entityManager.close(); 
    28.  
    29.         /** 關(guān)閉EntityManagerFactory對(duì)象 */ 
    30.  
    31.         emf.close(); 
    32.  
    33.     } 
    34.  
    35. } 

    public class CustomerClient {

    public static void main(String[] args) {

    /** 創(chuàng)建EntityManagerFactory對(duì)象 */

    EntityManagerFactory emf = Persistence

    .createEntityManagerFactory("jpaUnit");

    /** 創(chuàng)建entityManager對(duì)象 */

    EntityManager entityManager = emf.createEntityManager();

    Query query = entityManager.createQuery("SELECT c FROM CustomerEO c");

    List<CustomerEO> result = query.getResultList();

    for (CustomerEO c : result) {

    System.out.println(c.getId() + "," + c.getName());

    }

    /** 關(guān)閉entityManager對(duì)象 */

    entityManager.close();

    /** 關(guān)閉EntityManagerFactory對(duì)象 */

    emf.close();

    }

    }


    但是,在J2SE環(huán)境中使用JPA需要將實(shí)現(xiàn)的JPA的第三方類包和數(shù)據(jù)庫(kù)的驅(qū)動(dòng)包,設(shè)置到當(dāng)前的運(yùn)行環(huán)境下。

    例如,在Eclipse中創(chuàng)建一個(gè)Java項(xiàng)目,需要將JPA實(shí)現(xiàn)者的類庫(kù)(這里以Hibernate為例)和MySQL的數(shù)據(jù)庫(kù)連接包添加到構(gòu)建路徑中,如圖11-2所示。

    11.1.5  ThreadLocal的使用

    對(duì)于在Web容器中使用EntityManager對(duì)象,這里需要做一些改進(jìn),才能更安全。讀者應(yīng)該了解,Servlet是非線程安全的,所以需要改變獲得EntityManager對(duì)象的方式,這里筆者建議使用ThreadLocal類。

    ThreadLocal就是為每一個(gè)使用某變量的線程都提供一個(gè)該變量值的副本,使每一個(gè)線程都可以獨(dú)立地改變自己的副本,而不會(huì)和其他線程的副本沖突。從線程的角度看,就好像每一個(gè)線程都完全擁有一個(gè)該變量,這就解決了Servlet非線程安全的問(wèn)題。

    首先編寫一個(gè)EntityManagerHelper類,代碼如下所示。

    1. public class EntityManagerHelper { 
    2.  
    3.     
    4.  
    5.     private static final EntityManagerFactory emf; 
    6.  
    7.     private static final ThreadLocal<EntityManager> threadLocal; 
    8.  
    9.     
    10.  
    11.     /**初始化*/ 
    12.  
    13.     static { 
    14.  
    15.         emf = Persistence.createEntityManagerFactory("jpaUnit");        
    16.  
    17.         threadLocal = new ThreadLocal<EntityManager>(); 
    18.  
    19.     } 
    20.  
    21.     
    22.  
    23.     /**通過(guò)threadLocal 獲得EntityManager 對(duì)象*/ 
    24.  
    25.     public static EntityManager getEntityManager() { 
    26.  
    27.         EntityManager manager = threadLocal.get();      
    28.  
    29.         if (manager == null || !manager.isOpen()) { 
    30.  
    31.             manager = emf.createEntityManager(); 
    32.  
    33.             threadLocal.set(manager); 
    34.  
    35.         } 
    36.  
    37.         return manager; 
    38.  
    39.     } 
    40.  
    41.     
    42.  
    43.     /**關(guān)閉EntityManager 對(duì)象*/ 
    44.  
    45.     public static void closeEntityManager() { 
    46.  
    47.         EntityManager em = threadLocal.get(); 
    48.  
    49.         threadLocal.set(null); 
    50.  
    51.         if (em != null) em.close(); 
    52.  
    53.     } 
    54.  
    55.     
    56.  
    57.     public static void beginTransaction() { 
    58.  
    59.     getEntityManager().getTransaction().begin(); 
    60.  
    61.     } 
    62.  
    63.     
    64.  
    65.     public static void commit() { 
    66.  
    67.     getEntityManager().getTransaction().commit(); 
    68.  
    69.     }  
    70.  
    71.     
    72.  
    73.     public static Query createQuery(String query) { 
    74.  
    75.         return getEntityManager().createQuery(query); 
    76.  
    77.     } 
    78.  
    79.     
    80.  
    81. } 

    public class EntityManagerHelper {



    private static final EntityManagerFactory emf;

    private static final ThreadLocal<EntityManager> threadLocal;



    /**初始化*/

    static {

    emf = Persistence.createEntityManagerFactory("jpaUnit");      

    threadLocal = new ThreadLocal<EntityManager>();

    }



    /**通過(guò)threadLocal 獲得EntityManager 對(duì)象*/

    public static EntityManager getEntityManager() {

    EntityManager manager = threadLocal.get();    

    if (manager == null || !manager.isOpen()) {

    manager = emf.createEntityManager();

    threadLocal.set(manager);

    }

    return manager;

    }



    /**關(guān)閉EntityManager 對(duì)象*/

    public static void closeEntityManager() {

    EntityManager em = threadLocal.get();

    threadLocal.set(null);

    if (em != null) em.close();

    }



    public static void beginTransaction() {

    getEntityManager().getTransaction().begin();

    }



    public static void commit() {

    getEntityManager().getTransaction().commit();

    }



    public static Query createQuery(String query) {

    return getEntityManager().createQuery(query);

    }



    }



    這樣經(jīng)過(guò)改進(jìn)后,在Servlet中創(chuàng)建EntityManager對(duì)象的方法修改為如下所示。

    1. public class TestServlet extends HttpServlet { 
    2.  
    3.     public TestServlet() { 
    4.  
    5.         super(); 
    6.  
    7.     } 
    8.  
    9.     public void doPost(HttpServletRequest request, HttpServletResponse response) 
    10.  
    11.             throws ServletException, IOException { 
    12.  
    13.             EntityManager entityManager = EntityManagerHelper.getEntityManager(); 
    14.  
    15.             try { 
    16.  
    17.                 Query query = entityManager 
    18.  
    19.                         .createQuery("SELECT c FROM CustomerEO c"); 
    20.  
    21.                 List<CustomerEO> result = query.getResultList(); 
    22.  
    23.                 for (CustomerEO c : result) { 
    24.  
    25.                     System.out.println(c.getId() + "," + c.getName()); 
    26.  
    27.                 } 
    28.  
    29.             } finally { 
    30.  
    31.                 /**關(guān)閉EntityManager*/ 
    32.  
    33.                 EntityManagerHelper.closeEntityManager(); 
    34.  
    35.             } 
    36.  
    37.     } 
    38.  
    39. } 

    posted on 2012-06-15 21:36 張金鵬 閱讀(2645) 評(píng)論(0)  編輯  收藏 所屬分類: JPA
    主站蜘蛛池模板: 国产精品爱啪在线线免费观看| 亚洲成在人线在线播放无码 | 亚洲youjizz| 成年女人午夜毛片免费视频| 一级女性全黄生活片免费看| 久久久亚洲欧洲日产国码aⅴ | 国产免费丝袜调教视频| 亚洲av无码av在线播放| 国产成人亚洲精品91专区手机| 美女隐私免费视频看| 亚洲成年轻人电影网站www| 成人一a毛片免费视频| a级毛片高清免费视频就| 亚洲精品无码久久久久YW| 亚洲国产精品va在线播放| 日韩黄色免费观看| 久久久免费的精品| 亚洲AⅤ男人的天堂在线观看| 国产色婷婷精品免费视频| 久久国产精品免费专区| 羞羞网站在线免费观看| 亚洲欧洲自拍拍偷综合| 国产亚洲成归v人片在线观看| 成年大片免费视频播放一级| 亚洲伊人久久大香线蕉在观 | 亚洲国产精品一区二区九九 | 男女超爽刺激视频免费播放| 一本岛v免费不卡一二三区| 国产精品亚洲一区二区麻豆| 亚洲精品国偷自产在线| 四虎永久成人免费影院域名| 韩国免费一级成人毛片| 最近免费mv在线观看动漫| 老司机午夜性生免费福利| 亚洲一区二区三区丝袜| 日韩亚洲AV无码一区二区不卡| 美女被免费喷白浆视频| 无码免费一区二区三区免费播放| 亚洲一区中文字幕久久| 精品国产综合成人亚洲区| 亚洲va中文字幕无码|