我非常接近解决方案,但任何事情仍然是错误的,希望得到帮助,提前谢谢。
我有一个客户域模型,如:
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”的尝试中 - 但我需要一些类似于唯一约束的东西。
答案 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
}
)
}
}