簡體   English   中英

如何在非Java EE Web服務器(例如Tomcat)中設計JPA

[英]How to design for JPA in a non-Java EE web server (e.g. Tomcat)

考慮到沒有可用的@PersistenceContext來注入EntityManager,再加上您需要手動管理事務,設計這種應用程序的最佳方法是什么?

據我所知,對於EntityManagerFactory / EntityManager,您必須讓每個DAO在構造函數中都接受EntityManager,例如

public class DAOImpl implements DAO
{
    private EntityManager em;

    DAOImpl(EntityManager em){
        this.em = em;
    }

    //all CRUD operations follow
}

提出的第一個問題是何時調用EntityManager#close()

要點A:我認為,最好在請求周期結束時在Filter中執行此操作,這意味着您將EntityManager與當前線程相關聯(使用ThreadLocal?)

第二個問題是,如何以及何時注入EntityManager?

考慮到在其中創建和關閉EntityManagerFactory的ServletContextListener ,我們可以有一個靜態方法,如下所示

public static EntityManager createEntityManager(){
return entityManagerFactory.createEntityManager(PERSISTENT_NAME);
}

但由於我們要封裝創建DAO,因此可以使用工廠,例如

public class DAOFactory
{
    public static DAO dao(){
    //return a new DAO
    }
}

按照Point A,我們應該使用ThreadLocal為當前線程使用EntityManager創建DAO。

用於管理交易。

我能想到的最好的方法(模仿JPA規范)是創建自己的Transaction批注,並使用反射注入begin / commit / rollback操作。

然后,您應該從DAOFactory返回一個代理來處理事務

我不會那樣做。 為什么嘗試自己重新創建整個JPA規范? 您只需要能夠在沒有容器的情況下使用JPA。

Spring可以幫助您。 試試吧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM