【问题标题】:Lazyloading collection in play-salatplay-salat 中的延迟加载集合
【发布时间】:2013-09-19 21:27:30
【问题描述】:

是否可以使用 Sala 加载一个惰性集合?

例如我有一个类似的对象

示例 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()
}

如何在没有用户列表的情况下加载第一个示例中的对象? 或者:如何加载第二个示例中的用户列表?

提前致谢!

【问题讨论】:

    标签: mongodb scala playframework casbah salat


    【解决方案1】:

    在这里祝愿作者。

    Salat 没有 ORM 延迟加载之类的功能。 @Persist 注解旨在将字段在构造函数之外持久化,但会抑制反序列化,因为只有构造函数中的字段会被反序列化。

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

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

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

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

    另一种策略是将用户文档分解为子集合 - 请参阅https://github.com/novus/salat/wiki/ChildCollection 了解更多信息。在本例中,Test 是“父”,User 是“子”。

    这里的策略是在父DAO中,在保存的时候,重写save方法来保存使用子DAO的用户,然后将users设置为Nil的父对象保存。

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

    如果您想用users 检索Test,您需要手动向您的DAO 添加一个查找方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 2013-06-17
      • 2020-01-23
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      相关资源
      最近更新 更多