Guice-Injected DAO应该是单身吗?

obe*_*ger 5 java dao hibernate jpa guice

我目前正在开发一个利用Guice/JPA/Hibernate从我的数据库中获取信息的应用程序.

我在这里阅读了有关使用JPA和EntityManagars的Guice文档:http://code.google.com/p/google-guice/wiki/JPA,

但我很难理解何时应该制作我的DAO实现单身人士.

我看了这个问题,它说关于Spring的使用DAO的对S/O:

为每个请求实例化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;
    }
}
Run Code Online (Sandbox Code Playgroud)

它是如何被称为:

   @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....

   }
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助.

Gui*_*let 5

不,因为EntityManager绝对不是线程安全的.您需要使用提供商.