2013-09-19 4 views
0

Можно ли загрузить коллекцию ленивым с помощью Sala?Lazyloading collection in play-salat

например. У меня есть объект, как

пример 1 (в данном случае, весь список пользователей загружаются при извлечении объекта)

case class Test(
    @Key("_id") _id: ObjectId = new ObjectId, 
    name: String, 
    users: List[User]) { 
} 

или Пример 2 (объект загружается без списка, но не знаю, как чтобы получить список пользователей)

case class Test(
    @Key("_id") _id: ObjectId = new ObjectId, 
    name: String) { 
    @Persist val users: List[User] = List() 
} 

Как загрузить объект в первом примере без списка пользователей? или: Как загрузить список пользователей во втором примере?

Заранее благодарен!

ответ

1

Автор салата здесь.

У Salat нет ничего подобного ORM ленивой загрузки. Обозначение @Persist предназначено для сохранения полей вне конструктора, но подавляет десериализацию, потому что десериализуются только поля в конструкторе.

Но вы можете легко решить, когда вы делаете запрос, хотите ли вы список пользователей или нет.

case class Test(@Key("_id") id = new ObjectId, name: String, users: List[User] = Nil) 

Вы можете упорствовать пользователей, как вложенные документы внутри тест документа, а затем использовать второй аргумент запроса, реф, чтобы исключить (0) или включать в себя (1) поля в объекте.

TestDAO.find(/* query */, MongoDBObject("users" -> 0)) 

Другая стратегия вспыхнуть документы пользователя в коллекцию детской - см https://github.com/novus/salat/wiki/ChildCollection для получения дополнительной информации. В этом примере Test является «родителем», а User является «дочерним».

Стратегия заключается в том, что в родительском DAO при сохранении вы переопределяете методы сохранения для сохранения пользователей с использованием дочернего DAO, а затем сохраняете родительский объект с users, установленным на Nil.

Затем, по умолчанию, экземпляр Test извлекается с помощью users, установленного в Nil.

Если вы хотите получить Test с users, вам нужно будет добавить метод поиска для вашего DAO, который вручную:

  1. найти тестовый документ
  2. использовать _id поле тестового документа для запроса для пользовательских документов родительского ид - это даст List[User]
  3. десериализации тестовый документ к экземпляру Test с помощью grater[Test] и скопировать его в список пользователей