grails复合“独特约束”,但如何?

时间:2011-11-06 20:30:33

标签: grails foreign-keys gorm composite-key

我非常接近解决方案,但任何事情仍然是错误的,希望得到帮助,提前谢谢。

我有一个客户域模型,如:

class BoCustomer implements Serializable{

    String firstName
    String lastName
    String emailID
    Company company
}

所以,我有一个主键=“id”,没关系。因此,我需要一种独特的约束来“检查”以下内容:“只有一个公司的一个唯一电子邮件地址”,以便允许插入相同的电子邮件,但仅限于不同的公司。插入( test@test.com 公司ID:1 )并插入( test@test.com company-id :1 )是不允许的,但是插入( test@test.com company-id:1 )并插入( test @ test。 company-id:2 )是允许的。

所以我到目前为止尝试过:

static mapping = {
    id column: "customer_id", generator: "identity"
    emailcompany composite: ['emailID', 'company'], unique: true
}

(似乎“好”,但不完全是我想要的)

但我不想要另一个专栏,在我的名为“emailcompany”的尝试中 - 但我需要一些类似于唯一约束的东西。

2 个答案:

答案 0 :(得分:8)

您可以通过可用的主要约束之一指定此行为:unique

class BoCustomer implements Serializable{

    String firstName
    String lastName
    String emailID
    Company company

    static constraints = {
        emailID(unique: 'company')
            // OR
        company(unique: 'emailID')
    }
}

您可以在此处查看unique约束的完整规范http://grails.org/doc/latest/ref/Constraints/unique.html

答案 1 :(得分:1)

如果要使用约束强制执行此操作,则应该能够使用自定义验证程序,以便在BoCustmer已存在且具有相同的emailID和公司时返回false。自从我使用它已经有一段时间了,但我认为这样的事情应该有效:

class BoCustomer implements Serializable{
    String firstName
    String lastName
    String emailID
    Company company

    static constraints = {
        emailID( 
            validator: { val, obj ->
                def customerWithSameEmailAndCompany = BoCustomer.findByEmailIDAndCompany(obj.emailID, obj.company)
                return !customerWithSameEmailAndCompany
            }
        )
    }
}