java - 注入(inject) Guice 的 DAO 应该是单例吗?

标签 java hibernate jpa guice dao

我目前正在开发一个应用程序,利用 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/

相关文章:

java - 为什么使用 invokedynamic 调用 Java 8 lambda?

java - Eclipse AVD 不显示

java - HomePageController 中的字段 itemRepository 需要一个 ItemRepository 类型的 bean,但无法找到

java - Spring Data JPA - for循环不保存实体

java - 从 p :selectCheckboxMenu with a primefaces ajax event "change"? 取消选择最后一个选定项目时如何更新支持 bean

Java:如何及时停止HttpURLConnection.getInputStream?

java - 无法从 CMSSigned 数据获取 SignerCertificate

java - 强制执行刷新以获取新的主键 ID 来存储 EmbeddedId

java - hibernate session.get 返回 null

java - 特定应用种子数据群