【问题标题】:How to design for JPA in a non-Java EE web server (e.g. Tomcat)如何在非 Java EE Web 服务器(例如 Tomcat)中设计 JPA
【发布时间】:2009-06-24 23:24:32
【问题描述】:

考虑到没有@PersistenceContext 可用于注入EntityManager,再加上您需要手动管理事务,那么设计这样一个应用程序的最佳方式是什么?

对于 EntityManagerFactory/EntityManager,据我所知,您必须让每个 DAO 都接受 costructor 中的 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?

考虑到有一个ServletContextListener,我们在其中创建和关闭EntityManagerFactory,我们可以有一个静态方法如下

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

但由于我们想要封装创建 DAO,我们可以使用工厂,例如

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

根据 A 点,我们应该使用 ThreadLocal 来为当前线程使用 EntityManager 创建 DAO。

用于管理事务。

我能想到的最好方法(模仿 JPA 规范)是创建自己的事务注释并使用反射来注入开始/提交/回滚操作。

然后您应该从处理事务的 DAOFactory 返回一个 Proxy

【问题讨论】:

    标签: java design-patterns


    【解决方案1】:

    我不会那样做。为什么要尝试自己重新创建整个 JPA 规范?您只需要能够在没有容器的情况下使用 JPA。

    Spring 可以帮助您解决这个问题。试试看。

    【讨论】:

    • 我也实在看不出来,但既然这些都是对我的限制,我必须想办法实现它。
    猜你喜欢
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2012-02-15
    • 2019-08-29
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2017-04-22
    相关资源
    最近更新 更多