Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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 是否有一个“问题”;“干净”;“解决方案”;“对象管理器已关闭”;错误(JPA)?_Java_Google App Engine_Jpa_Google Cloud Datastore - Fatal编程技术网

Java 是否有一个“问题”;“干净”;“解决方案”;“对象管理器已关闭”;错误(JPA)?

Java 是否有一个“问题”;“干净”;“解决方案”;“对象管理器已关闭”;错误(JPA)?,java,google-app-engine,jpa,google-cloud-datastore,Java,Google App Engine,Jpa,Google Cloud Datastore,我在Google App Engine上使用JPA(不是JDO),这是我服务方法的一个典型示例: @Autowired EntityManagerFactory entityManagerFactory; public Collection<Message> getAll() { EntityManager em = entityManagerFactory.createEntityManager(); Collection<Message> resul

我在Google App Engine上使用JPA(不是JDO),这是我服务方法的一个典型示例:

@Autowired
EntityManagerFactory entityManagerFactory;

public Collection<Message> getAll() {
    EntityManager em = entityManagerFactory.createEntityManager();
    Collection<Message> result = null;

    try {
        Query query = em.createQuery("SELECT e FROM Message e");
        result =  query.getResultList();
        //The workaround
        //if(result != null) result.size();
    } finally {
        em.close();
    }

    return result;
}   
@Autowired
实体管理工厂实体管理工厂;
公共集合getAll(){
EntityManager em=EntityManager工厂。createEntityManager();
采集结果=null;
试一试{
Query Query=em.createQuery(“从消息e中选择e”);
结果=query.getResultList();
//解决办法
//if(result!=null)result.size();
}最后{
em.close();
}
返回结果;
}   

当我尝试在方法之外使用集合时,我会收到“著名”的错误报告,即对象管理器已关闭。调用size()方法是一种变通方法,但我不喜欢这种“肮脏”的解决方案。我想知道没有任何方法可以分离此集合或禁用延迟加载

我不知道它是否“干净”,但经常推荐的方法是使用servlet过滤器,在代码运行之前创建线程本地EntityManager,并在最后关闭它。

我不知道它是否“干净”,但是一种经常被推荐的方法是使用servlet过滤器,它在代码运行之前创建线程本地EntityManager,并在最后关闭它。

如果您使用spring(正如您所看到的那样),这是向视图公开EntityManager的“正确”方法,因此,允许在视图中延迟获取持久性集合。

如果您使用spring(如您所见),这是向视图公开EntityManager的“正确”方式,从而允许在视图中延迟获取持久性集合。

使用GAE JPA插件的v2;再简单不过了

使用GAE JPA插件的v2;再简单不过了

使用Guice JPA插件,再简单不过了


使用Guice JPA插件,再简单不过了


这似乎是一个很好的解决方案。因为我使用Springframework而不是线程本地,所以它应该是一个请求范围bean。这似乎是一个很好的解决方案。因为我使用Springframework而不是线程本地,所以它应该是一个请求范围bean。