如何在Sorm中为有很多孩子的实体建模?

Hbf*_*Hbf 3 scala sorm

我有一个WorkspaceDocument实体,其想法是工作空间可以包含零个,一个或多个文档.我对此进行建模的第一种方法是:

case class Workspace(name: String, documents: Seq[Document])
Run Code Online (Sandbox Code Playgroud)

但由于我的工作区可能包含许多文档,因此无法很好地扩展.幸运的是,我的业务需求,允许我单独处理工作空间和文件(在这个意义上,当我有一个工作空间,也没有迫使我考虑其中包含的所有文件的原因还是不变).

问:我想知道:我将如何建模WorkspaceDocumentSORM使我有两个之间的联系,但没有加载一个工作区的所有文件?我想有一个存储库可以让我访问工作区的文档,并提供分页支持.)

case class Workspace(name: String)
case class Document(name: String, /* ... */)

trait WorkspaceRepository {
  def children(ws: Workspace, offset: Long, limit: Long)
}
Run Code Online (Sandbox Code Playgroud)

Nik*_*kov 6

十分简单!你定义它们不相关:

case class Workspace ( name : String )
case class Document ( ... )
Run Code Online (Sandbox Code Playgroud)

然后,您选择希望它们链接的方式.我看到两个.

变体#1

case class WorkspaceDocuments 
  ( workspace : Workspace, documents : Seq[Document] )
Run Code Online (Sandbox Code Playgroud)

并获取工作区的所有文档,如下所示:

Db.query[WorkspaceDocuments]
  .whereEqual("workspace", theWorkspace)
  .fetchOne()
  .map(_.documents)
  .getOrElse(Seq())
Run Code Online (Sandbox Code Playgroud)

在这种情况下,workspace在实例声明中将属性指定为唯一是有意义的:

... Instance (
  entities = Set() +
             Entity[WorkspaceDocuments]( unique = Set() + Seq("workspace") )
  ...
)
Run Code Online (Sandbox Code Playgroud)

变种#2

case class WorkspaceToDocument
  ( workspace : Workspace, document : Document )
Run Code Online (Sandbox Code Playgroud)

并获取工作空间的文档,如下所示:

Db.query[WorkspaceToDocument]
  .whereEqual("workspace", theWorkspace)
  .whereEqual("document.name", "...") // ability to filter docs
  .fetch()
  .map(_.document)
Run Code Online (Sandbox Code Playgroud)

第一个变体不允许您过滤查询中的文档(至少在SORM v0.3.*中),但由于能够在工作区上设置唯一约束,它应该在基于工作空间的查询上执行得更好.第二种变体更灵活,允许您应用各种过滤器.