我有一个Workspace
和Document
个实体,我们认为工作区可以包含零个,一个或多个文档。我对此进行建模的第一种方法是:
case class Workspace(name: String, documents: Seq[Document])
但由于我的工作区可能包含许多文档,因此无法很好地扩展。幸运的是,我的业务需求允许我单独处理工作空间和文档(从某种意义上说,当我有工作空间时,没有理由或不变量迫使我考虑其中包含的所有文档。)
问题:我想知道:我如何在Sorm中对Workspace
和Document
进行建模,以便我在两者之间建立联系但没有加载工作区的所有文档?我想有一个Repository可以让我访问工作区的文档,并提供分页支持。)
case class Workspace(name: String)
case class Document(name: String, /* ... */)
trait WorkspaceRepository {
def children(ws: Workspace, offset: Long, limit: Long)
}
答案 0 :(得分:6)
轻松自在!你定义它们无关:
case class Workspace ( name : String )
case class Document ( ... )
然后您选择希望它们链接的方式。我看到两个。
case class WorkspaceDocuments
( workspace : Workspace, documents : Seq[Document] )
获取工作空间的所有文档:
Db.query[WorkspaceDocuments]
.whereEqual("workspace", theWorkspace)
.fetchOne()
.map(_.documents)
.getOrElse(Seq())
在这种情况下,在实例声明中将workspace
属性指定为唯一是有意义的:
... Instance (
entities = Set() +
Entity[WorkspaceDocuments]( unique = Set() + Seq("workspace") )
...
)
case class WorkspaceToDocument
( workspace : Workspace, document : Document )
获取工作空间的文档:
Db.query[WorkspaceToDocument]
.whereEqual("workspace", theWorkspace)
.whereEqual("document.name", "...") // ability to filter docs
.fetch()
.map(_.document)
第一个变体不允许您过滤查询中的文档(至少在SORM v0.3。*中),但由于能够在工作区上设置唯一约束,它应该在基于工作空间的查询上执行得更好。第二种变体更灵活,允许您应用各种过滤器。