Java 是否有一个“问题”;“干净”;“解决方案”;“对象管理器已关闭”;错误(JPA)?
我在Google App Engine上使用JPA(不是JDO),这是我服务方法的一个典型示例: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
@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。