我目前正在开发一个应用程序,利用 Guice/JPA/Hibernate 从我的数据库中获取信息。
我在这里阅读了关于使用 JPA 和 EntityManagars 的 Guice 文档:http://code.google.com/p/google-guice/wiki/JPA ,
但我无法理解何时应该将我的 DAO 实现单例化。
我读过这个question关于 Spring 使用 DAO 的 S/O,它说:
Instantiating a DAO for every request would be crazy.
除 Spring 之外,这是否适用于 DI 容器?如果我将 DAO 提供程序注入(inject)我的 Servlet 并在需要时调用,DAO 服务实现是否应该是单例?
这是我的一个 DAO 的基本轮廓:
public DAOImpl implements DAOService { <-- SHOULD THIS BE ANNOTATED @Singleton?
@Inject
private EntityManager em;
// OR
// @Inject
// private Provider<EntityManager> emProvider - If it's a singleton.
@Inject
DAOImpl(OtherServices os) {
this.otherServices = os;
}
@Transactional
public MyPersistedObject getPersistedObject(long id) {
MyPersistedObject mpo = em.find(MyPersistedObject.class, id);
return mpo;
}
}
它的称呼:
@Singleton
public MyServlet(HttpRequest req, HttpRequest res)
extends ServletInterfaceOfTheDay {
private final daoService; // If Singleton
// OR
// private final Provider<DAOService>; If Instanced DAO
@Inject
MyServlet(DAOService dao) {
this.daoService = dao;
}
// Gather Information from request here...
MyPersistedObject mpo = daoService.getPersistedObject(requestIdInfo);
// OR daoService.get().getPersistedObject(requestIdInfo);
// Process Response Info here....
}
感谢您的帮助。
最佳答案
不,因为 EntityManager 绝对不是线程安全的。您需要使用提供商。
关于java - 注入(inject) Guice 的 DAO 应该是单例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9541046/