Grails / GORM:org.hibernate.AssertionFailure:xyz中的null id(发生异常后不要刷新Session)

时间:2015-03-15 23:33:24

标签: hibernate grails gorm

编辑:得到-1,你能解释一下原因吗?我搜索了重复项,没有发现任何内容。

针对刚刚遇到的问题发布问答:

class Pineapple {
    def pineappleService

    Supplier supplier;

    def beforeInsert() {
        pineappleService.beforeInsert(this);
    }
}

class PineappleService {
    def beforeInsert(Pineapple pineapple) {
         Pineapple.withNewSession {
             // some logic
             pineapple.supplier.save();
         }
    }
}

例外:

  

org.hibernate.AssertionFailure:xyz中的null id(发生异常后不要刷新会话)

1 个答案:

答案 0 :(得分:3)

诀窍是将闭包移动到域类:

class Pineapple {
    def pineappleService

    Supplier supplier;

    def beforeInsert() {
        Pineapple.withNewSession {
            pineappleService.beforeInsert(this);
        }
    }
}

class PineappleService {
    def beforeInsert(Pineapple pineapple) {
         // some logic
         pineapple.supplier.save();
    }
}

文档:

  

注意上面使用withNewSession方法。因为事件是   在Hibernate使用持久化方法冲洗时触发了   除非您运行,否则save()和delete()不会导致保存对象   使用新会话进行操作。

     

幸运的是,withNewSession方法允许您共享相同的内容   事务性JDBC连接,即使您使用的是另一种   基础会议。