Play-salat中的Lazy Loading系列

时间:2013-09-19 21:27:31

标签: mongodb scala playframework casbah salat

是否可以加载一个懒惰的集合?

e.g。我有一个像

这样的对象

示例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 个答案:

答案 0 :(得分:1)

Salat作者在这里。

Salat没有像ORM懒加载的东西。 @Persist注释用于保存构造函数的外部,但是禁止反序列化,因为只有构造函数中的字段才会被反序列化。

但您可以轻松决定何时进行查询是否需要用户列表。

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

您可以将用户作为嵌入式文档保留在测试文档中,然后使用查询的第二个参数ref来排除对象中的(0)或include(1)字段

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

另一个策略是将用户文档分解为子集合 - 有关详细信息,请参阅https://github.com/novus/salat/wiki/ChildCollection。在此示例中,Test是“父级”,User是“子级”。

在父DAO中,策略是在保存时,覆盖保存方法以使用子DAO保存用户,然后将users设置为Nil的父对象保存。 / p>

然后,默认情况下,检索Test实例,users设置为Nil。

如果您想使用Test检索users,则需要手动为DAO添加一个find方法:

  1. 找到测试文档
  2. 使用测试文档的_id字段按父ID查询用户文档 - 这将产生List[User]
  3. 使用Test将测试文档反序列化为grater[Test]的实例,并将其与用户列表一起复制