Есть ли «чистое» решение для ошибки «Диспетчер объектов был закрыт» (JPA)? - PullRequest
0 голосов
/ 19 января 2012

Я использую JPA (не JDO) в Google App Engine, и это типичный пример моего метода обслуживания:

@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 ]

2 голосов
/ 19 января 2012

Я не знаю, является ли он "чистым", но часто рекомендуемый подход состоит в том, чтобы иметь фильтр сервлета, который создает локальный по потоку EntityManager до запуска вашего кода и закрывает его в самом конце.

1 голос
/ 19 января 2012

Если вы используете spring (как вам кажется), OpenEntityManagerInViewFilter - это «правильный» способ представления EntityManager для представлений, что позволяет лениво извлекать постоянные коллекции в вашем представлении.

0 голосов
/ 19 января 2012

Используйте плагин Guice JPA, намного проще, чем это.

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

0 голосов
/ 19 января 2012

Использовать v2 плагина GAE JPA; не может быть намного проще

...