Как получить доступ к EntityManager из службы Grails (JPA + GAE) - PullRequest
1 голос
/ 16 ноября 2010

У меня проблемы с доступом к EntityManager из службы Grails:

Моя настройка следующая ...

  • Приложение Basic Grails сплагины AppEngine и GORM-JPA
  • Настройки по умолчанию практически для всего.Я не трогал resources.groovy, persistence.xml и т. Д.

Некоторые вещи хороши ...

  • У меня есть доступEntityManager изнутри контроллеров, просто добавив «def entityManager».

Но ...

  • У меня есть служба, которую я пытаюсьоднако для доступа к EntityManager я получаю «java.lang.IllegalStateException: EntityManager уже закрыт!»исключение.
  • Плагин закрывает где-нибудь EntityManager?Нужно ли как-то менять область действия EntityManager?Есть ли какой-нибудь XML-файл, который мне нужно обновить, чтобы обеспечить правильное внедрение?

    class GoogleCalendarService implements InitializingBean {
        void afterPropertiesSet() {
        }
    
    
    <pre><code>   def entityManager
    
    
       public OAuthToken getAccessToken(User u) {
           //can't access entityManager from here
           entityManager.newQuery(...) //throws an IllegalStateException
       }
    
    }

Одно странное замечание: по какой-то причине, если я повторно сохранюСлужба, когда Jetty работает и работает, может получить доступ к EntityManager только один раз.Если я нажму «перезагрузить» (и контроллер снова получит доступ к службе), служба больше не сможет получить доступ к EntityManager ...

1 Ответ

1 голос
/ 17 ноября 2010

Полагаю, правильный способ сделать это - использовать EntityManagerFactory, например:

import org.springframework.orm.jpa.EntityManagerFactoryUtils

class GoogleCalendarService implements InitializingBean {
    void afterPropertiesSet() {

    }

    def entityManagerFactory
    EntityManager em

    public OAuthToken getAccessToken(User u) {
        em = EntityManagerFactoryUtils.getTransactionalEntityManager(entityManagerFactory)
        //do stuff with em
    }
}
...