настройка ассоциаций напрямую через id в grails

У меня есть 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 для ручного создания ассоциации. В рельсах такая функциональность встроена в активную запись. Есть ли способ сделать это в Grails?


person David Chanin    schedule 14.01.2010    source источник


Ответы (1)


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

person Burt Beckwith    schedule 14.01.2010
comment
Интересный. Таким образом, на самом деле мне не нужно беспокоиться об уменьшении количества запросов, необходимых в качестве средства оптимизации с помощью спящего режима, если у меня есть настройка кеша (grails не настраивает это автоматически?)? Кажется, я начинаю понимать, почему разработчики Java так много говорят о спящем режиме. Кстати, ваш плагин UI-Performance потрясающий! - person David Chanin; 14.01.2010