grails多列唯一约束的替代(乐观插入)

时间:2015-03-19 15:08:44

标签: hibernate grails gorm

我有一个繁重的使用域类Relationship,看起来非常类似于跟随一个

class Relationship {
    Element source
    Element destination
    Type type

    // other properties omitted

    static constraints = {
         type unique: ['source', 'destination']
    }
}

我有一个服务创建这个域类的新实例,它检查现有实例,如果发现重用它们,但我想在数据库中实现一种带有唯一约束的乐观插入,因为

  1. GORM独特的约束是非常低效的(对于一个简单的任务,我只需要检查约束的13,000次点击和花费的三分之一时间)
  2. 在批量运行时查找现有实体的成本很高(每个查询刷新当前会话并花费大约40毫秒)
  3. 因此,我们的想法是让save方法失败,而不是重用现有的实体

    try {
        relationshipInstance.save()
    } catch (DataIntegrityViolationException | ConstraintViolationException e) {
        // find and reuse
    }
    

    但是当我试图找到实体时,我得到了hibernate异常

    AssertionFailure: null id in Relationship entry (don't flush the Session after an exception occurs)
    
    1. 有没有办法如何从异常中恢复(relationshipInstance.discard()没有帮助,因为它没有EntityKey)?
    2. 在没有触发刷新的情况下,您建议使用哪种其他解决方案进行按需唯一性检查?

1 个答案:

答案 0 :(得分:0)

您可以在调用save时禁用验证,如下所示:

relationshipInstance.save(validate:false)

有关详细信息,请参阅documentation for save method