У Grails есть много в обратном направлении?

При использовании hasMany и ownTo я могу перемещаться от источника, но не от цели назад к источнику отношения.

Пример кода Grails:

class School {
  hasMany [students : Student]
}

class Student {
  belongsTo [school : school]
}

// Following works
School scl = new School()
scl.addToStudents(new Student("firstStudent"))
scl.addToStudents(new Student("secondStudent"))
scl.save()
assertEquals(2, scl.students.size())

// Following does not work
School scl = new School()
scl.save() // so that it generated ID and persisted
Student std = new Student(school: scl)
std.save()
assertEquals(2, std.school.students) // This FAILS!

Почему это не получается при поиске по Student? Насколько я понимаю, это должно работать.


person 18bytes    schedule 05.02.2014    source источник


Ответы (2)


Последняя строка должна быть:

assertEquals(1, std.school.students.size())

вместо того

assertEquals(2, std.school.students)

Попробуйте также перечитать состояние объектов перед утверждением.

person Sergei Shushkevich    schedule 05.02.2014
comment
Повторное чтение экземпляров обычно не выполняется из-за путаницы с Hibernate. Если вы get() экземпляр или повторно запросите несколько экземпляров, и они уже связаны с сеансом, вы просто вернете те же экземпляры. Вам необходимо очистить сеанс (и flush() для хорошей оценки), чтобы это было действительным. Сделать это довольно просто, например AnyDomainClass.withSession { it.flush(); it.clear() } - person Burt Beckwith; 06.02.2014
comment
Если вы переместите свой комментарий в ответ, я приму то же самое. Прямо сейчас я не мог принять это как ответ. Хотя это и есть ответ. - person 18bytes; 06.02.2014
comment
На самом деле это не лучший ответ, просто уточнение комментария Сергея. - person Burt Beckwith; 06.02.2014

Берт Беквит

Повторное чтение экземпляров обычно не выполняется из-за путаницы с Hibernate. Если вы получите () экземпляр или повторно запросите несколько экземпляров, и они уже связаны с сеансом, вы просто вернете те же экземпляры. Вам нужно очистить сеанс (и flush () для хорошей меры), чтобы это было действительным. Сделать это довольно просто, например AnyDomainClass.withSession {it.flush (); it.clear ()} - Берт Беквит 6 часов назад

Это решение работает!

person 18bytes    schedule 06.02.2014