![](/img/trans.png)
[英]How to publish non-Java resources generated at runtime on a Tomcat server?
[英]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.