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

gra*_*s0r 8 grails foreign-keys composite-key grails-orm

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

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

class BoCustomer implements Serializable{

    String firstName
    String lastName
    String emailID
    Company company
}
Run Code Online (Sandbox Code Playgroud)

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

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

static mapping = {
    id column: "customer_id", generator: "identity"
    emailcompany composite: ['emailID', 'company'], unique: true
}
Run Code Online (Sandbox Code Playgroud)

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

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

小智 9

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

class BoCustomer implements Serializable{

    String firstName
    String lastName
    String emailID
    Company company

    static constraints = {
        emailID(unique: 'company')
            // OR
        company(unique: 'emailID')
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以uniquehttp://grails.org/doc/latest/ref/Constraints/unique.html看到约束的完整规范.


Kal*_*see 2

如果您想通过约束强制执行此操作,您应该能够使用自定义验证器,以便在具有相同 emailID 和公司的 BoCustommer 已存在时返回 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
            }
        )
    }
}
Run Code Online (Sandbox Code Playgroud)