是否可以使用 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()
}
如何在没有用户列表的情况下加载第一个示例中的对象?或者:如何在第二个示例中加载用户列表?
提前感谢!
萨拉特的作者在这里。
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 中,在保存时,您覆盖保存方法以使用子 DAO 保存用户,然后保存父对象,users
设置为 Nil
。
然后,默认情况下,检索Test
实例,users
设置为 Nil。
如果你想用users
检索Test
,你需要在你的DAO中添加一个手动的find方法:
- 查找测试文档
- 使用测试文档的
_id
字段按父 ID 查询用户文档 - 这将产生List[User]
- 使用
grater[Test]
将测试文档反序列化为Test
实例,并将其与用户列表一起复制