【发布时间】:2013-03-07 05:47:56
【问题描述】:
Grails 2.2.0
我正在尝试创建一个自定义约束来强制用户只有一个主电子邮件。这是导致错误的简化代码:
用户域类
class User {
static hasMany = [emails: Email]
static constraints = {
}
}
电子邮件域类
class Email {
static belongsTo = [user: User]
String emailAddress
Boolean isMaster
static constraints = {
emailAddress unique: ['user']
isMaster validator: { val, obj ->
return !val || Email.findByUserAndIsMaster(obj.user, true) == null
}
}
}
集成测试
class EmailTests {
@Before
void setUp() {
}
@After
void tearDown() {
// Tear down logic here
}
@Test
void testSomething() {
def john = (new User(login: 'johnDoe')).save(failOnError: true, flush: true)
assert (new Email(emailAddress: 'john@gmail.com', user: john, isMaster: true)).save(failOnError: true)
}
}
运行“grails test-app -integration”会导致:
|失败:testSomething(webapp.EmailTests)
| org.hibernate.AssertionFailure:webapp.Email 条目中的空 id(发生异常后不要刷新会话) 在 org.grails.datastore.gorm.GormStaticApi$_methodMissing_closure2.doCall(GormStaticApi.groovy:105) 在 webapp.Email$__clinit__closure1_closure2.doCall(Email.groovy:13) 在 org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener.onApplicationEvent(AbstractPersistenceEventListener.java:46) 在 webapp.EmailTests.testSomething(EmailTests.groovy:21)
如果我将唯一约束更改为自定义约束之后,问题将不会发生。这里发生了什么?我想了解这里的任何相关约束的顺序如何?
要明确,这不会导致问题:
static constraints = {
isMaster validator: { val, obj ->
return !val || Email.findByUserAndIsMaster(obj.user, true) == null
}
emailAddress unique: ['user']
}
【问题讨论】:
-
测试中的关系不是倒过来的吗?我想你想使用
john.addToEmails()。约翰是拥有方。在您的测试中,您使用Email就像它是拥有方:-) -
如果我这样做了同样的问题:
void testSomething() { def john = new User(login: 'johnDoe').save(failOnError: true) def email = new Email(emailAddress: 'john@gmail.com', isMaster: true) john.addToEmails(email) assert john.save(failOnError: true) }
标签: hibernate grails constraints integration-testing grails-2.2