Guice-Injected DAO应该是单身吗?

时间:2012-03-02 22:09:10

标签: java hibernate jpa guice dao

我目前正在开发一个使用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....

   }

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

是的,DAO应该是单身人士,但必须通过提供商检索EntityManager。