Грааль 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: '[email protected]', user: john, isMaster: true)).save(failOnError: true)
}
}
Запуск "grails test-app -integration" вызовет:
| Ошибка: testSomething(webapp.EmailTests)
| org.hibernate.AssertionFailure: нулевой идентификатор в записи webapp.Email (не очищайте сеанс после возникновения исключения) в 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
, как будто это сторона-владелец :-) - person Bart   schedule 19.03.2013void testSomething() { def john = new User(login: 'johnDoe').save(failOnError: true) def email = new Email(emailAddress: '[email protected]', isMaster: true) john.addToEmails(email) assert john.save(failOnError: true) }
- person Raipe   schedule 19.03.2013