Jpa 泽西岛+;香港2+;Grizzly:注射EntityManager的正确方法?
我已经设法在Jersey、HK2和一个普通的GrizzlyServer中设置了我自己的服务类的注入(到资源类中)。(基本上是这样的。) 我现在很好奇,将JPA 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
工厂
:
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
-方法从未被调用
我的问题是:
工厂。dispose(T)
,向injectableCloseableService注册可以完成您想要的大部分工作。需要一个可关闭的适配器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;
}
}