Прежде всего, я использую модифицированную версию Spring Security для проверки подлинности Active Directory, а также проверку наличия разрешений доступа, хранящихся в базе данных. Это означает, что вызов в нормальном Groovy класса для загрузки информации из базы данных:Grails - Зачем нужен Transaction?
if (Holders.config.loadRolesFromDatabase)
{
Set<DomainClassRole> roles = DomainClassUser.findByUsername(username)?.roles
if (roles)
authorities.addAll(roles.collect({ new SimpleGrantedAuthority('ROLE_' + it.name) }))
}
Это работает большое с Hibernate 4.3.6.1 и Tomcat 7.0.54, однако, после модернизации и (до 4.3. 10.18 и 8.0.14.1) теперь он вызывает исключение «HibernateException: No Session found for current thread» при вызове метода динамического поиска. После выполнения некоторых исследований я решил обернуть этот код в withTransaction блоке:
if (Holders.config.loadRolesFromDatabase)
{
DomainClassUser.withTransaction({
Set<DomainClassRole> roles = DomainClassUser.findByUsername(username)?.roles
if (roles)
authorities.addAll(roles.collect({ new SimpleGrantedAuthority('ROLE_' + it.name) }))
})
}
Это исправляет ошибку, однако, я не совсем уверен, почему это необходимо. Мое настоящее понимание withTransaction заключается в том, что оно используется для создания транзакций, которые можно отбросить в случае исключения и т. Д. Однако мне не нужно выполнять откат (это все только для чтения), почему я все еще нужна транзакция для выполнения этого вызова?
Не знаете, почему поведение изменилось, и у вас нет сеанса, но, возможно, вы можете использовать 'withNewSession' вместо' withTransaction' для (возможно) лучшей производительности и более описательного кода? –