2015-03-14 4 views
0

У меня есть два класса домен один является игра:Двухсторонних один ко многим отношений

class Game { 
    String name 
    String description 
    Double price 
    static hasMany = [reviews: Review] 
} 

, а другой является Обзор:

class Review { 
    String reviewText 
    Date reviewDate 
    static belongsTo = [game: Game] 
} 

Оба урезанной версии. У меня есть два объекта

r1 = new Review([reviewText: "A game review", reviewDate: new Date()]) 
g = new Game([name:"Angry Birds", description:"Parabolic physics like game", 20.00]) 
r1.game=g 
r1.save() 

После вышеуказанного звонка это заявление является законным?

g.reviews 

Будет ли он возвращать список всех обзоров, связанных с игрой? На самом деле у меня есть старый код Grails, который отображает список отзывов g.reviews, таких как звонки, и на Grails 2.4.4, я получаю нуль. Было ли это законным в более старых версиях Grails? Каков рекомендуемый способ получения отзывов, связанных с конкретной игрой?

+0

После я выполнил g.delete(), он удаляется только игру из базы данных в то время как отзывы были целы. В соответствии с документацией по граалю, предполагается, что каскадная операция удаления. –

ответ

1

сохранить с flush:true, если вы хотите немедленно получить доступ к db.

r1.save(flush:true) 

тогда вы можете сказать:

g.reviews 
+0

Спасибо за ваш ответ. Почему-то это тоже не работает для меня. Вот (http://pastebin.com/dV5ANS4f) мой вывод оболочки Grails. –

+0

Я использую flush: true или нет, я могу видеть только изменения после перезагрузки. Таблица моих отзывов обновляется в моей базе данных, но g.reviews по-прежнему возвращает null. Как только я выхожу из оболочки Grails и перезагружаю его, g.reviews показывает отзывы, которые я добавил в предыдущем сеансе. Это довольно странно. Это из-за поведения Hibernate, что он выполняет операцию БД за один раз, когда у него достаточно записей? Как я могу изменить это поведение? –

+0

Что касается моего комментария о удалении каскада, он работает, только если я перезапущу приложение. g.delete() удаляет игру, а также соответствующие рецензии из записи БД (подтвердил это, просмотрев таблицы в моих postgres), но g.name все равно возвращает имя вместо null, а g.reviews возвращает отзывы, даже если оно было удалено из DB. Hibernate, конечно, вытаскивает это из кешей, и если я перезапущу приложение, я получаю то, что ожидаю. Но это болезненная задача перезапуска приложения при каждом обновлении записи. –

Смежные вопросы