代码之家  ›  专栏  ›  技术社区  ›  aioobe

Jersey+HK2+Grizzly:注入EntityManager的正确方式?

  •  7
  • aioobe  · 技术社区  · 11 年前

    我已经成功地在Jersey、HK2和一个普通的GrizzlyServer中设置了自己的服务类的注入(到资源类中)。(基本遵循 this example .)

    我现在很好奇在我的资源类中注入JPA EntityManagers的最佳方法是什么?(我目前正在考虑将一个请求作为一个工作单元)。我目前正在探索的一个选项是使用 Factory<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();
        }
    
    }
    

    并将其绑定如下:

    bindFactory(new MyEntityManagerFactory())
            .to(EntityManager.class)
            .in(RequestScoped.class);
    

    问题是 dispose -方法永远不会被调用。

    我的问题:

    1. 这是在Jersey+HK2中注入EntityManagers的正确方法吗?
    2. 如果是,我应该如何确保我的EntityManagers正确关闭?

    (我宁愿不依赖于沉重的容器或额外的依赖注入库来覆盖这个用例。)

    1 回复  |  直到 11 年前
        1
  •  6
  •   ScootyPuff    11 年前

    代替 Factory<T>.dispose(T) ,在注射剂上注册 CloseableService 可以做你想做的大部分事情。A. Closeable 将需要适配器。 可关闭服务 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;
        }
    }