[英]"No transaction is in progress" error while following Grails Spring Security Core tutorial
我正在关注他们文档中的 Grails Spring Security Core 教程。 当我到达 24.1.5.5 时,问题就开始了。 我被指示将 Bootstrap.groovy 修改为以下内容,然后运行该应用程序:
package com.mycompany.myapp
class BootStrap {
def init = {
def adminRole = new Role(authority: 'ROLE_ADMIN').save()
def testUser = new User(username: 'me', password: 'password').save()
UserRole.create testUser, adminRole
UserRole.withSession {
it.flush()
it.clear()
}
assert User.count() == 1
assert Role.count() == 1
assert UserRole.count() == 1
}
}
运行应用程序给了我这个错误:
2020-03-31 15:46:19.294 错误 --- [restartedMain] osboot.SpringApplication:应用程序运行失败
javax.persistence.TransactionRequiredException: org.hibernate.internal.SessionImpl.checkTransactionNeeded(SessionImpl .java:3586) 上没有正在进行的事务
我试图使用@Transactional 来解决这个问题,但它对错误没有影响。 将 Bootstrap.groovy 恢复为其默认值可让应用程序正常运行。 本教程缺少(或不正确)什么导致它失败?
文档已过时。 Hibernate 5.2+ 现在需要事务进行写操作。 添加 @Transactional 不起作用,因为init
是一个闭包,并且注释适用于方法或类。
在引导程序中创建一个新方法并向其添加事务。 然后从您的 init 闭包中调用它。 例如。
class BootStrap {
def init = {
addTestUsers()
}
@Transactional
void addTestUsers() {
def adminRole = new Role(authority: 'ROLE_ADMIN').save()
def testUser = new User(username: 'me', password: 'password').save()
UserRole.create testUser, adminRole
UserRole.withSession {
it.flush()
it.clear()
}
assert User.count() == 1
assert Role.count() == 1
assert UserRole.count() == 1
}
}
您也可以尝试https://github.com/grails/grails-core/issues/11376 中的解决方案,其中说您可以将配置添加到 application.yml
hibernate:
allow_update_outside_transaction: true
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.