【发布时间】:2015-01-12 01:10:44
【问题描述】:
首先是一些背景知识:我正在使用 Spring Security 的修改版本来执行 Active Directory 身份验证,并检查存储在数据库中的可能访问权限。这意味着在普通的 Groovy 类中有一个调用来从数据库中加载信息:
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以获得(可能)更好的性能和更具描述性的代码?
标签: java spring hibernate grails transactions