当前位置: 首页 > 知识库问答 >
问题:

如何在jersey/hk2应用程序中正确配置EntityManager?

易俊友
2023-03-14

我有一个使用JPA持久性的jersey-2/hk2应用程序。启动时绑定EntityManager如下所示

public MyApplication() {
    // ...
    register(new AbstractBinder() {
        @Override
        public void configure() {
          bindFactory(EmFactory.class)
            .to(EntityManager.class)
            .in(RequestScoped.class);
        }
    });
}
public class EmFactory implements Factory<EntityManager> {

    private static final String PERSISTENCE_UNIT = "unit";

    private EntityManagerFactory emf;
    private CloseableService closeableService;

    @Inject
    public EmFactory(@Named(PERSISTENCE_UNIT) String persistenceUnit,
            CloseableService closeableService) {
        emf = Persistence.createEntityManagerFactory(persistenceUnit);
        this.closeableService = closeableService;
    }

    @Override
    public EntityManager provide() {
        final EntityManager entityManager = emf.createEntityManager();
        closeableService.add(new Closeable() {

            @Override
            public void close() throws IOException {
                if(entityManager.isOpen()) {
                    entityManager.close();
                }
            }
        });
        return entityManager;
    }

    @Override
    public void dispose(EntityManager entityManager) {
        if(entityManager.isOpen()) {
            entityManager.close();
        }
    }
}
HHH000436: Entity manager factory name (unit) is already registered. \
  If entity manager will be clustered or passivated, specify a unique \
  value for property 'hibernate.ejb.entitymanager_factory_name'

共有1个答案

戈博易
2023-03-14

一种选择是,您可以为EntityManagerFactory创建一个单例工厂,然后将EntityManagerFactory注入EMFactory中,而不是在EMFactory中创建一个新的EntityManagerFactory

public class EMFFactory implements Factory<EntityManagerFactory> {
    private final EntityManagerFactory emf;
    public EMFFactory (){
        emf = Persistence.createEntityManagerFactory(persistenceUnit);
    }
    public EntityManagerFactory provide() {
        return emf;
    }
    ...
}

public class EMFactory implements Factory<EntityManager> {
    private final EntityManager em;

    @Inject
    public EMFactory (EntityManagerFactory emf){
        em = emf.createEntityManager();
    }
    public EntityManager provide() {
        return em;
    }
    ...
}

我还没有测试过这个精确的实现,但是它应该是这样的。我以前用过这种模式

register(new AbstractBinder() {
    @Override
    public void configure() {
      bindFactory(EMFFactory.class).to(EntityManagerFactory.class).in(Singleton.class);
      bindFactory(EMFactory.class).to(EntityManager.class).in(RequestScoped.class);
    }
});

关于上面的示例需要注意的一点是,它不会清理资源,即EntityManager应该关闭;它不会自己关闭。在Factory类中有一个Dispose方法,我们需要重写这个方法,但根据我的经验,Jersey从来没有调用过这个方法。

我们可以做的是将EntityManager添加到[CloseableService][1]

public class EMFactory implements Factory<EntityManager> {
    private final EntityManagerFactory emf;
    private final CloseableService closeService;

    @Inject
    public EMFactory (EntityManagerFactory emf, CloseableService closeService){
        this.emf = emf;
        this.closeService = closeService;
    }
    public EntityManager provide() {
        final EntityManager em = emf.createEntityManager();
        this.closeService.add(new Closeable(){
            @Override
            public void close() {
                em.close();
            }
        });
        return em;
    }
    ...
}

这样可以确保EntityManager在请求结束时关闭。

 类似资料:
  • 问题内容: 我有一个使用JPA持久性的jersey-2 / hk2应用程序。将在这样的约束启动 工厂级的 这可行,但是对于每个请求,我都会在日志中收到有关已注册EntityManager的警告: 我究竟做错了什么?在jersey-2 / hk2应用程序中初始化EntityManager的正确方法是什么? 问题答案: 一种选择是不是创建一个新的(这是在请求范围内),您可以创建为一个单独的工厂,然后就

  • 我正在尝试在我的Jersey/Hk2应用程序中注入EntityManagerFactory(作为一个单例)和EntityManager(在请求范围中)。 My EntityManagerFactoryProvider(单例): My EntityManagerProvider(每个请求)为: 我的应用程序是: 和web.xml 多谢

  • 问题内容: 我正在为我的游戏创建一个关卡编辑器,但在将LwjglCanvas与JFrame一起使用时遇到了问题。我使用JFrame(而不是LwjglFrame)来保持引擎和关卡编辑器尽可能独立。我有两个JAR:WorldEditor.jar和GameEngine.jar。在WorldEditor内部,我有一个名为“测试”的按钮,该按钮假设是将GameEngine.jar(如果尚未加载)加载并将其启

  • 我正在尝试使用我自己的应用程序实现或扩展的ResourceConfig或PackageResourceConfig来配置我的Jersey应用程序。因此,我的第一次尝试是将现有的web.xml(实际上,由于开发的库性质,我使用的是web-fragment.xml)配置移植到MyApplication实现。 当我使用第二个版本时,我会收到以下信息 正如您所看到的,是第一个注册的类,但由于它不是公共的,

  • 本文向大家介绍The application has failed...(应用程序配置不正确),包括了The application has failed...(应用程序配置不正确)的使用技巧和注意事项,需要的朋友参考一下         在我们开发工程中,可能有些情况下,不能在本机进行调试。这个时候我们一般会使用VM(vmware)建立一个虚拟机环境,然后把编译过的程序放在该虚拟机环境下执行调试

  • 试图让一个nodejs应用程序与PM2一起运行。 我们使用SASS,通过“节点-SASS-Middleware”将文件修改后的文件重建为css文件。在每次sass中间件重建css文件时,pm2开始自动重启应用程序之前,它都工作得很好...这是我们告诉它要做的: 谢谢,约翰