当前位置: 首页 > 面试题库 >

如何从“发生异常后不刷新会话”错误中恢复?

鞠自明
2023-03-14
问题内容

我有两节课:

用户

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”。由于存在新的临时角色对象,因此Hibernate尝试自动刷新会话。但是,此时存在尚未与角色关联的新用户对象(在用户域中不能为空)。因此,在刷新时,用户对象未通过验证,因此具有null
ID(如异常中所述)。

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

另一种选择(尽管不是很好)是将会话刷新模式设置为手动。

    User.withSession{ sessionObj ->
        sessionObj.setFlushMode(FlushMode.MANUAL);
        //put your Role.findBy mthod call here
        sesshtml" target="_blank">ionObj.setFlushMode(FlushMode.AUTO);

    }


 类似资料:
  • 问题内容: 当取消注释时,我们将在第二种方法中获得en异常- 当作者。 为什么会这样呢? 问题答案: 问题似乎是Hibernate引发了一个异常(因此当前事务无效),但是随后您尝试在该会话中继续执行更多操作。 正确的方法是将您使用的测试分为2部分,一部分测试空作者,另一部分测试有效作者。 在生产代码(例如控制器)上,您需要重新启动操作(关闭事务,重新启动流程)才能继续。但是,考虑到游戏管理交易的方

  • 你好,我是PHP中的web开发人员,最近迁移到javaEE。我在mysql中创建表。这是第一类: . . . 这是我的第二节课: . . .

  • 我设置了一个非常基本的Grails 3 web应用程序,使用jdbc连接到PostgreSQL数据库。下面您可以找到< code>Cluster域类和专用服务的代码。 碰巧用同一个< code>slug参数调用了< code>createCluster方法两次: 导致以下异常 我以为违反一约束会被方法拦截,但显然我错了。好吧,所以我添加了一个try/catch,但它基本上没有效果,异常没有被包装,

  • 我有一个hibernate和JSF2应用程序进入部署服务器,突然抛出一个org。冬眠AssertionFailure:异常中的空id。我将立即提供堆栈跟踪和代码,但首先有四个重要问题: > 这只发生在部署服务器(Jboss)上 研究这一点,人们在尝试插入对象时似乎会出现这种错误。但是当我做一个简单的查询时,我得到了错误。(实际上,各种不同的查询,因为错误会随机出现在多个页面上。) 错误只会偶尔出现

  • 我试图在一个catch块中执行一些更新操作。冬眠例外ConstraintViolationException抛出如下 我正在使用Hibernate 4.3.6 这是我的UserRegistrationRequest实体 这是我的UserSecurityQuestions实体 尝试在catch块中执行更新时,我遇到以下错误 如果我抓住异常而不是约束违反异常看到下面的错误 有人能帮帮我吗,有没有更好的

  • 编辑:得到一个-1,你能解释一下为什么吗?我搜索了重复项,但没有找到任何重复项。 为我刚刚遇到的问题发布Q/a: 例外情况: org.hibernate.AssertionFailure: null id in xyz (在发生异常后不要刷新会话)