scala – 如何在Sorm中为有许多孩子的实体建模?
发布时间:2020-12-16 09:26:56 所属栏目:安全 来源:网络整理
导读:我有一个Workspace和Document实体,其工作空间可以包含零个,一个或多个文档.我对此进行建模的第一种方法是: case class Workspace(name: String,documents: Seq[Document]) 但由于我的工作区可能包含许多文档,因此无法很好地扩展.幸运的是,我的业务需求允许
我有一个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) } 解决方法
十分简单!你定义它们无关:
case class Workspace ( name : String ) case class Document ( ... ) 然后,您选择希望它们链接的方式.我看到两个. 变体#1 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") ) ... ) 变体#2 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.*中),但由于能够在工作区上设置唯一约束,它应该在基于工作空间的查询上执行得更好.第二种变体更灵活,允许您应用各种过滤器. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读