我目前正在开发一个使用Guice / JPA / Hibernate从我的数据库中获取信息的应用程序。
我在这里阅读了有关使用JPA和EntityManagars的Guice文档:http://code.google.com/p/google-guice/wiki/JPA,
但是我很难理解何时应该制作DAO实现单身人士。
关于Spring使用DAO的内容,我已经在S / O上阅读了这个question:
为每个请求实例化DAO都会很疯狂。
对于除Spring以外的DI容器,是否可以继续使用?如果我将DAO Provider注入我的Servlet并在需要时调用,那么DAO服务实现是否应该是Singleton?
以下是我的一个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....
}
感谢您的帮助。
答案 0 :(得分:5)
不,因为EntityManager绝对不是线程安全的。您需要使用提供商。
答案 1 :(得分:0)
是的,DAO应该是单身人士,但必须通过提供商检索EntityManager。