Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Guice应该注入DAO';我们是单身吗?_Java_Hibernate_Jpa_Guice_Dao - Fatal编程技术网

Java Guice应该注入DAO';我们是单身吗?

Java Guice应该注入DAO';我们是单身吗?,java,hibernate,jpa,guice,dao,Java,Hibernate,Jpa,Guice,Dao,我目前正在开发一个应用程序,利用Guice/JPA/Hibernate从我的数据库中获取信息 我已经在这里阅读了关于与JPA和EntityManagars合作的Guice文档: 但我很难理解何时应该使我的DAO实现成为单例 我在S/O上读到过关于Spring使用DAO的文章,其中写道: 为每个请求实例化一个DAO将是疯狂的 除Spring外,DI容器是否还存在这种情况?如果我将DAO提供程序注入Servlet并在需要时调用,DAO服务实现应该是单例的吗 以下是我的一把刀的基本轮廓: public

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

我已经在这里阅读了关于与JPA和EntityManagars合作的Guice文档:

但我很难理解何时应该使我的DAO实现成为单例

我在S/O上读到过关于Spring使用DAO的文章,其中写道:

为每个请求实例化一个DAO将是疯狂的

除Spring外,DI容器是否还存在这种情况?如果我将DAO提供程序注入Servlet并在需要时调用,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;
    }
}

public DAOImpl实现DAOService{不,因为EntityManager绝对不是线程安全的。您需要使用提供程序。

是的,DAO应该是单例的,但EntityManager必须通过提供程序检索。

因此,通过提供程序到servlet使用实例DAOImpl?这是不是太过分了?我的模式错了吗?不,在我看来很好。只要使用提供程序,您就很好了好的,我想您使用的是PersistFilter和JpaPersistModule,对吧(我不完全确定名称的准确性)?或者,您可以选择在DAO中使用提供程序,这也很好。您可以在DAOJpaPersistModule中使用Singleton是,但不使用PersistFilter,我编辑了我的问题以包括我对@Transactional的使用。
   @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....

   }