0

我试图了解 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
    }
}
4

2 回答 2

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

于 2013-03-13T06:42:53.667 回答
0

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

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

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

于 2013-03-12T21:00:21.530 回答