gpt4 book ai didi

hibernate - 发生异常后如何从 `don' 恢复 t 刷新 session `错误?

转载 作者:行者123 更新时间:2023-12-04 17:26:20 24 4
gpt4 key购买 nike

我有两个类(class):

用户

class User {
//relationships. . . .
static belongsTo = [ company : Company, role : Role ]
static hasMany = [ holidays : Holiday ]
String login
String password
static constraints = {
login(unique:true,size:6..15)
}
String toString() {
this.login
}
}

还有一个这样的类:

角色 :
class Role {
String roleName
String privilege
static hasMany = [ user : User ]
static constraints = {
privilege(nullable:true)
roleName(unique:true)
}
String toString() {
this.roleName
}
}

我写了一个这样的集成测试:
            def user1 = new User(login:"aravinth", password:"secret")
def user2 = new User(login:"anto", password:"secret")
def user3 = new User(login:"antoa", password:"secret")
def role1 = new Role(roleName:"manager").save()
def role2 = new Role(roleName:"devleoper").save()
role1.addToUser(user1)
role1.addToUser(user2)
role2.addToUser(user3)
assert "manager" == user1.role.roleName

这个测试工作正常。但是当我将以下行添加到我上面的测试代码中时:
def roleMembers = Role.findByRoleName("manager")

我收到这样的错误:
null id in mnm.schedule.User entry (don't flush the Session after an exception occurs)
org.hibernate.AssertionFailure: null id in mnm.schedule.User entry (don't flush the Session after an exception occurs)
at org.grails.datastore.gorm.GormStaticApi.methodMissing(GormStaticApi.groovy:108)
at mnm.schedule.RoleItntegrationTests.testAddingRolesToUser(RoleItntegrationTests.groovy:44)

这是怎么回事?我哪里错了?

我正在使用 Grails 2.0。

提前致谢。

最佳答案

您收到此错误的原因是当语句 Role.findBy 静态方法执行时,Hibernate(由 grails GORM 使用)检查是否需要“autoFlush”。由于存在新的 transient Role 对象,Hibernate 会尝试自动刷新 session 。然而,此时存在尚未与角色相关联的新用户对象(在用户域中不可为空)。因此,在刷新时,用户对象未通过验证,因此具有异常中提到的空 ID。

解决这个问题的方法是进行所有数据库读取调用(例如 findBy 方法)在您开始之前 创建/更新相同类型的实体。

另一种选择(虽然不是很好)是手动设置 session 刷新模式。

    User.withSession{ sessionObj ->
sessionObj.setFlushMode(FlushMode.MANUAL);
//put your Role.findBy mthod call here
sessionObj.setFlushMode(FlushMode.AUTO);

}

关于hibernate - 发生异常后如何从 `don' 恢复 t 刷新 session `错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8636503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com