Открытие / закрытие и отложенная инициализация сессий Grails - PullRequest
0 голосов
/ 03 мая 2018

У меня есть куча исключений, связанных с сессиями, таких как:

org.hibernate.LazyInitializationException failed to lazily initialize a collection of role: <...>, no session or session was closed
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session
org.hibernate.TransientObjectException: cannot lock an unsaved transient instance: <...>
org.hibernate.UnresolvableObjectException: No row with the given identifier exists

Я пытаюсь понять, почему. Итак, я активировал журналы SQL, и когда я смотрю статистику гибернации, я вижу 80 открытых и 80 закрытых сессий, даже если запрос http не закончен ... Я думал, что OSIV (который активируется по умолчанию в grails) может предотвратить некоторые вещи с отложенным инициализацией, но, как я вижу, сессии открываются, а затем закрываются по требованию (для транзакций).

Так почему бы мне не открыть хотя бы один сеанс до конца http-запроса?

Есть ли у вас идеи понять / расследовать происходящее?

Большое спасибо

Versions used:
    Grails 2.5.6
    GORM 3.1.4 
    Spring 4.1.9
    Hibernate3 3.6.10

1 Ответ

0 голосов
/ 03 мая 2018

Похоже, что вы пытаетесь получить доступ к геттеру на объекте вне контроллера / службы grails.

Если у вас лениво инициированные отношения, и вы хотите получить к ним доступ, тогда вы должны использовать withTransaction closure:

YourEntityClass.withTransaction{
    yourEntityClass.getX()
    // more logic
}

Другие обходные пути:

  • сохраняйте свою логику в Service
  • Использовать готовую загрузку
...