Grails GORM загрузка коллекции объектов эмиссии - PullRequest
0 голосов
/ 08 июля 2011

Я пытаюсь загрузить список оценок в классе с именем Contributor, но мне чего-то не хватает, так как я не могу пройти тест.

Мой тест создает и сохраняет объекты, как ожидалось, потому что, когда явыполните Evaluations.list () и Contributor.list () и распечатайте значения, которые я вижу, сохраненные данные.

Кроме того, когда я выбираю Evaluation и распечатываю значение его свойства contributor, оно выглядит какправильно.

Однако, когда я выбираю Contributor и печатаю значения его свойства 'Оценки', он равен null.

Я предполагаю, что мое сопоставление является проблемой?

class Contributor {
    String name

    static hasMany = [evals:Evaluation]

    static mapping = {
        id column: 'user_id'
        evals joinTable:[name:'evaluation', column:'eval_id', key:'eval_user_id']
        version false
    }
}

class Evaluation {
    Contributor contributor
    String comment

    static mapping = {
        id column:'eval_id'
        contributor column:'eval_user_id'
        version false
    }
}

Спасибо.

Ответы [ 2 ]

2 голосов
/ 09 июля 2011

Вы не должны назначать evals как contributor.evals = [eval]. Скорее вызовите динамический метод addTo*(): contributor.addToEvals(eval). Это создаст коллекцию Hibernate для evals, которая будет сохранена позже.

Первый не работал, потому что Grails не назначает другой конец ассоциации, когда вы назначаете eval.contributor, т.е. он не вызывает contributor.addToEvals(eval). Я понятия не имею, почему - должна быть какая-то причина реализации.

Таким образом, contributor остается с тем же пустым evals в кэше Hibernate. Если он выпадает из кэша и вы перечитываете его, он будет заполнен evals, потому что сопоставление отображается только на Eval внешний ключ таблицы.

Пусто evals пусто - это еще одна особенность Hibernate: когда коллекция пуста, она может быть нулевой. Просто знай это.

Вот хороший короткий пост, объясняющий некоторые внутренности Hibernate: http://blog.xebia.com/2008/03/advanced-hibernate-proxy-pitfalls/

0 голосов
/ 08 июля 2011

Ааа, я подозревал это. Проблема в том, как я сохранял объекты.

Не работает следующее:

def contributor = new Contributor([name:'Homer']).save(failOnError:true)
def eval = new Evaluation([contributor:contributor, comment:'Must read article']).save(failOnError:true)

Это

def contributor = new Contributor([name:'Homer']).save(failOnError:true)
def eval = new Evaluation([contributor:contributor, comment:'a comment']).save(failOnError:true)
contributor.evals = [eval]
contributor.save(failOnError:true)

Или это работает:

def contributor = new Contributor([name:'Homer'])
def eval = new Evaluation([contributor:contributor, comment:'a comment'])
contributor.evals = [eval]
contributor.save(failOnError:true)

Не уверен, что я полностью понимаю, почему метод top top не работает при выборе данных, поскольку идентификатор участника сохранен в оценке.

...