GORM如何确保相关对象属性的唯一性

时间:2013-03-12 20:55:37

标签: grails gorm unique one-to-many

我正试图了解GORM和关系映射。关系正常,但有一个问题。我似乎无法确保添加到MailAddress的每个MailingList都有唯一的地址。什么是必须有效的方法来做到这一点?

注意: MailAddress.address没有唯一约束。相同的地址可以存在于同一个表中。

class MailAddress {

    String name
    String email

    static belongsTo = MailingList

    static constraints = {
        name blank:true
        email email:true, blank:false
    }
}

class MailingList {

    String name

    static hasMany = [addresses:MailAddress]

    static mapping = {
        addresses cascade: 'all-delete-orphan'
    }

    static constraints = {
        name blank:false
    }
}

2 个答案:

答案 0 :(得分:1)

如@ibaralf的评论所述,答案是自定义验证器。 MailingList类需要验证所有地址(MailAddress)是否具有唯一的电子邮件地址。

我将此约束添加到MailingList类并且它有效。

static constraints = {
    name blank:false

    addresses(validator: {

        if (!it) {
            // validates to TRUE if the collection is empty
            // prevents NULL exception
            return true
        }

        // Grab a collection with all e-mailaddresses in the list
        def addressCollection = it*.email
        // Compare to a collection with only unique addresses
        return addressCollection == addressCollection.unique()
    })
}

可在此处找到更多信息http://grails.org/doc/2.2.0/ref/Constraints/validator.html

答案 1 :(得分:0)

您可以添加一个唯一约束:

static constraints = {
    name blank:true
    email email:true, blank:false, unique: true
}

=>将唯一约束放在电子邮件变量上(唯一:true )。这样可以防止相同的电子邮件地址保存在表格中。