Я относительно новичок в Grails и создаю приложение для управления событиями. У меня проблема с тем, что один из классов моего домена не сохраняется после вызова метода .save()
, а только во время тестирования.
Итак, я упростил три класса домена: Персона, Событие и Участие. У меня проблемы с участием:
class Participation implements Serializable {
private static final long serialVersionUID = 1
Person person
Event event
static Participation create(Person person, Event event, boolean flush = false) {
def instance = new Participation(person: person, event: event)
instance.save([failOnError: true, flush: flush])
instance
}
static constraints = {
person nullable: false
event nullable: false, validator: { Event e, Participation pt ->
if (pt.person?.id) {
if (Participation.exists(pt.person.id, e.id)) {
return ['participation.exists']
}
}
}
}
static mapping = {
id composite: ['person', 'event']
version false
}
}
Я пытаюсь проверить, что произойдет, если человек присоединится к событию, которое уже заполнено, это обрабатывается в службе:
@Transactional
class UserService {
def join(Person p, Event e) {
if (e.getParticipants().size() >= e.maxParticipants) {
throw new EventFullException()
}
Participation.create(p, e)
}
}
Мой тест выглядит следующим образом:
class UserServiceSpec extends HibernateSpec implements ServiceUnitTest<UserService>{
void "a person cannot join a full event"() {
when:
Person p1 = save(new Person(name: "Test1"))
Person p2 = save(new Person(name: "Test2"))
Event e = save(new Event(name: "Event", start: LocalDateTime.now().plusDays(1), maxParticipants: 1))
service.join(p1, e)
then:
// Participation for some reason not saved ):
shouldFail(EventFullException) {
service.join(p2, e)
}
}
private def save(domain) {
domain.save flush: true, failOnError: true
}
Я вижу, что объекты домена Event и Person сохраняются, как и ожидалось, но для объекта участия отладчик (IntelliJ) отображает «несохраненный» рядом с ним. ,Это также тот случай, если я позвоню def part = save(new Participation(p1, e))
напрямую. Так что e.getParticipants().size()
равно 0, когда join(...)
вызывается во второй раз, и ошибка не выдается.
Все это работает, когда я нормально запускаю приложение и проверяю его вручную в браузере.
Что мне здесь не хватает? Спасибо за помощь.