加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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.*中),但由于能够在工作区上设置唯一约束,它应该在基于工作空间的查询上执行得更好.第二种变体更灵活,允许您应用各种过滤器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读