gpt4 book ai didi

jpa - Jersey + HK2 + 灰熊 : Proper way to inject EntityManager?

转载 作者:行者123 更新时间:2023-12-04 12:09:01 24 4
gpt4 key购买 nike

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

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

}

并将其绑定(bind)如下:
bindFactory(new MyEntityManagerFactory())
.to(EntityManager.class)
.in(RequestScoped.class);

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

我的问题:
  • 这是在 Jersey+HK2 中注入(inject) EntityManagers 的正确方法吗?
  • 如果是这样,我应该如何确保我的 EntityManagers 正确关闭?

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

    最佳答案

    代替Factory<T>.dispose(T) ,注册注入(inject)剂CloseableService可以做大部分你想做的事。一个 Closeable将需要适配器。 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;
    }
    }

    关于jpa - Jersey + HK2 + 灰熊 : Proper way to inject EntityManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19081840/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com