создание ассоциаций непосредственно через идентификаторы в Grails - PullRequest
2 голосов
/ 14 января 2010

У меня есть 2 доменных объекта с отношением один ко многим. Просто в качестве примера:

Class Author{
  static hasMany = [posts: Post]
}
Class Post{
  Author author
}

В базе данных таблица записей имеет поле с именем author_id. В моем приложении у меня есть несколько идентификаторов авторов, которые я хочу связать с постами. Я могу сделать это, сначала запросив базу данных у каждого автора, затем вызвав author.addToPosts (post). Тем не менее, так как у меня уже есть идентификаторы объектов автора, я должен иметь возможность просто установить post.authorId = authorId, чтобы создать ассоциацию (это все, что сделает grails в любом случае) и сократить количество запросов, запрашиваемых наполовину.

В реальном приложении, которое я пишу, выполнение этого сократит количество запросов, которые мне нужно сделать, примерно на 70%. Это критическое узкое место в приложении, и я не могу позволить себе иметь низкую производительность SQL. Я могу легко написать SQL-оператор, который будет делать именно это, но я не могу понять, как получить grails, чтобы позволить мне напрямую установить author_id для создания ассоциации вручную. В рельсах такая функциональность встроена в active-record. Есть ли способ сделать это в Grails?

1 Ответ

4 голосов
/ 14 января 2010

Сконфигурируйте кэш 2-го уровня для Author и вызовы get () будут извлекаться из кеша, а не из базы данных по большей части (экземпляры в кеше будут сбрасываться при редактировании). Тогда сетевой эффект будет именно тем, что вы ищете - автор будет кэширован, и Hibernate сможет использовать его для установки внешнего ключа Почты.

...