我正在使用Jersey进行RESTful Web服务。该服务应该仅读取数据库实体(每个操作读取不同的表),并且不需要与任何其他应用程序进行通信。
我尝试研究创建EntityManager的最佳实践,该实践对于只读操作是最佳的,但是我找不到特定的答案。 我了解可以有容器管理的或应用程序管理的实体管理器。我目前正在使用应用程序管理的实体管理器。
现在,我已经创建了如下的实体管理器:
public class EMFactory implements Factory<EntityManager>{
@Inject
public EMFactory(EntityManagerFactory emf, CloseableService closeService) {
this.emf = emf;
this.closeService = closeService;
}
public EntityManager provide() {
final EntityManager em = this.emf.createEntityManager();
this.closeService.add(() -> em.close());
return em;
}
}
我还有如下的AppConfig类
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.process.internal.RequestScoped;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
public class AppConfig extends AbstractBinder {
@Override
protected void configure() {
bindFactory(EMFFactory.class).to(EntityManagerFactory.class).in(Singleton.class);
bindFactory(EMFactory.class).to(EntityManager.class).in(RequestScoped.class);
}
}
我的问题是
谢谢。
更新
以下解决方案也对我有用,但是我不确定让EntityManager Singleton一直打开并保持最佳状态是否是最佳实践。
public class EMFactory implements Factory<EntityManager>{
@Inject
public EMFactory(EntityManagerFactory emf, CloseableService closeService) {
this.emf = emf;
}
public EntityManager provide() {
final EntityManager em = this.emf.createEntityManager();
return em;
}
}
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.process.internal.RequestScoped;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
public class AppConfig extends AbstractBinder {
@Override
protected void configure() {
bindFactory(EMFFactory.class).to(EntityManagerFactory.class).in(Singleton.class);
bindFactory(EMFactory.class).to(EntityManager.class).in(Singleton.class);
}
}