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)
你可以unique在http://grails.org/doc/latest/ref/Constraints/unique.html看到约束的完整规范.
如果您想通过约束强制执行此操作,您应该能够使用自定义验证器,以便在具有相同 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)
| 归档时间: |
|
| 查看次数: |
7542 次 |
| 最近记录: |