java - 如何在非 Java EE Web 服务器(例如 Tomcat)中设计 JPA

标签 java design-patterns

考虑到没有 @PersistenceContext 可用于注入(inject) 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?)

第二个问题是,如何以及何时注入(inject) 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 规范)是创建您自己的事务注释并使用反射来注入(inject)开始/提交/回滚操作。

然后您应该返回 Proxy来自处理事务的 DAOFactory

最佳答案

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

Spring 可以帮助你解决这个问题。尝试一下。

关于java - 如何在非 Java EE Web 服务器(例如 Tomcat)中设计 JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1041480/

相关文章:

ios - 在 UITableViewCell 和 UICollectionViewCell 之间共享代码

java - 通过 set 和 out 检查 jSTL 变量是否为空

java - 不能在 onEnable() 中使用成员变量

java - 在Java中收到websocket消息后取消TimerTask运行的filewatcher

c++ - 具有不同通知的观察者模式

java - 我应该公开组合对象吗?

java - 带 if 语句的 for 循环中的 stringbuilder

java - 我可以将 @ComponentScan 和 @Autowired 与 BasicDataSource 一起使用,而无需在 XML 中为 BasicDataSource 类声明 bean 吗?

java - 组合设计模式如何限制组件创建无限递归

java - Guice @Singleton 必须遵循 Singleton 设计模式吗?