Jpa 泽西岛+;香港2+;Grizzly:注射EntityManager的正确方法?

Jpa 泽西岛+;香港2+;Grizzly:注射EntityManager的正确方法?,jpa,dependency-injection,jersey,grizzly,hk2,Jpa,Dependency Injection,Jersey,Grizzly,Hk2,我已经设法在Jersey、HK2和一个普通的GrizzlyServer中设置了我自己的服务类的注入(到资源类中)。(基本上是这样的。) 我现在很好奇,将JPA EntityManager注入到我的资源类中最好的方法是什么?(我目前正在考虑将一个请求作为一个工作单元)。我目前正在探索的一个选项是以以下方式使用工厂: class MyEntityManagerFactory implements Factory<EntityManager> { EntityManagerFac

我已经设法在Jersey、HK2和一个普通的GrizzlyServer中设置了我自己的服务类的注入(到资源类中)。(基本上是这样的。)

我现在很好奇,将JPA EntityManager注入到我的资源类中最好的方法是什么?(我目前正在考虑将一个请求作为一个工作单元)。我目前正在探索的一个选项是以以下方式使用
工厂

class MyEntityManagerFactory implements Factory<EntityManager> {

    EntityManagerFactory emf;

    public MyEntityManagerFactory() {
        emf = Persistence.createEntityManagerFactory("manager1");
    }

    @Override
    public void dispose(EntityManager em) {
        em.close();
    }

    @Override
    public EntityManager provide() {
        return emf.createEntityManager();
    }

}
问题是,
dispose
-方法从未被调用

我的问题是:

  • 这是在泽西岛+香港2区注入EntityManager的正确方法吗
  • 如果是这样,我应该如何确保我的EntityManager正确关闭
  • (我不希望仅仅为了涵盖这个用例而依赖于重型容器或额外的依赖注入库。)

    代替
    工厂。dispose(T)
    ,向injectable
    CloseableService注册可以完成您想要的大部分工作。需要一个可关闭的
    适配器
    CloseableService
    closes()
    退出请求范围时所有注册的资源

    class MyEntityManagerFactory implements Factory<EntityManager> {
        private final CloseableService closeableService;
        EntityManagerFactory emf;
    
        @Inject
        public MyEntityManagerFactory(CloseableService closeableService) {
            this.closeableService = checkNotNull(closeableService);
            emf = Persistence.createEntityManagerFactory("manager1");
        }
    
        @Override
        public void dispose(EntityManager em) {
            em.close();
        }
    
        @Override
        public EntityManager provide() {
            final EntityManager em = emf.createEntityManager();
            closeableService.add(new Closeable() {
                public final void close() {
                    em.close();
                }
            });
            return em;
        }
    }
    
    类MyEntityManagerFactory实现工厂{
    私人最终可关闭服务可关闭服务;
    实体管理工厂emf;
    @注入
    公共MyEntityManager工厂(CloseableService CloseableService){
    this.closeableService=checkNotNull(closeableService);
    emf=Persistence.createEntityManagerFactory(“manager1”);
    }
    @凌驾
    公共无效处置(实体管理器em){
    em.close();
    }
    @凌驾
    公共实体管理器提供(){
    最终EntityManager em=emf.createEntityManager();
    closeableService.add(新closeables(){
    公开最终作废关闭(){
    em.close();
    }
    });
    返回em;
    }
    }
    
    在.yes上也提出了类似的问题。我已经对这个问题进行了投票和评论。我使用的是Jersey 2.10.1,我没有这个问题。按预期调用dispose()。
    class MyEntityManagerFactory implements Factory<EntityManager> {
        private final CloseableService closeableService;
        EntityManagerFactory emf;
    
        @Inject
        public MyEntityManagerFactory(CloseableService closeableService) {
            this.closeableService = checkNotNull(closeableService);
            emf = Persistence.createEntityManagerFactory("manager1");
        }
    
        @Override
        public void dispose(EntityManager em) {
            em.close();
        }
    
        @Override
        public EntityManager provide() {
            final EntityManager em = emf.createEntityManager();
            closeableService.add(new Closeable() {
                public final void close() {
                    em.close();
                }
            });
            return em;
        }
    }