有没有"清洁" "对象管理器的解决方案已经关闭"错误(JPA)?

时间:2012-01-19 08:25:41

标签: 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> 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;
}   

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

4 个答案:

答案 0 :(得分:2)

我不知道它是否是&#34; clean&#34;,但是经常推荐的方法是让一个servlet过滤器在代码运行之前创建一个线程本地的EntityManager并在它关闭它端。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

使用GAE JPA插件的v2;不能简单得多

答案 3 :(得分:0)

使用Guice JPA插件,不能简单得多。

http://code.google.com/p/google-guice/wiki/JPA