如果其中一个多列约束为null,则Hibernate`唯一`约束不起作用

时间:2018-01-23 09:53:27

标签: hibernate grails constraints

Hibernate中有一个名为unique的约束,如果某个属性在验证时不是唯一的,则会使某个属性抛出错误。例如:

class Person {
    String id
    Person mother
    Person father
    String fullName

    // Mapping closure goes here

    static constraints = {
        father nullable: true
        fullName unique: ["mother", "father"]
        mother nullable: true
    }
}

在这种情况下,只要在fullNamemother对中唯一值father,就允许Person的任何值。因此,如果有一个id=03 fullName=Liam的记录,比如id=01 fullName=Olivia,母亲id=02 fullName=William和父亲fullName,那么当另一条记录显示时会出现验证错误同一个id=04 fullName=Liam id=01 fullName=Olivia将插入母亲id=02 fullName=William和父亲null下。验证工作正常。

问题是当多列唯一约束之一是Person时。例如,当插入包含母id=03 fullName=Liamid=01 fullName=Olivia null的记录father fullName时,另一条记录具有相同的mother和{之后插入{1}},验证将不会触发。

我想知道这是否有限制。

P.S。我知道建议在数据库端有这个独特的约束。我已经有了。我想要的是对Hibernate方进行等效检查。

1 个答案:

答案 0 :(得分:0)

我目前正在使用自定义验证程序来捕获它(这超出了使用unique约束的目的)。

fullName unique: ["mother", "father"], validator { val, obj ->
    withSession { session ->
        Long count = Person.createCriteria().get {
            projections {
                rowCount()
            }

            eq("mother", obj.mother)
            eq("father", obj.father)
            eq("fullName", obj.fullName)
            ne("id", obj.id)
        }
        if(count > 0) {
            return ["unique"]
        }
    }
}

并在message.property文件中附加此行:

person.fullName.unique=[{0}] with value {2} must be unique.