定义投影以映射到嵌套的案例类

我有这些案例类:

case class PolicyHolder(id : String, firstName : String, lastName : String)
case class Policy(address : Future[Address], policyHolder : Future[PolicyHolder], created : RichDateTime, duration : RichDuration )

然后,我为策略定义了一个光滑的模式

class PolicyDAO(tag: Tag) extends Table[Policy](tag, "POLICIES") with DbConfig {
  def address = column[String]("ADDRESS", O.PrimaryKey)
  def policyHolder = foreignKey("POLICY_HOLDER_FK", address, TableQuery[PolicyHolderDAO])(_.id)

  def created = column[RichDateTime]("CREATED")
  def duration = column[String]("DURATION")

  def * = (address, policyHolder, created, duration) <> (Policy.apply, Policy.unapply)
}

什么是对我来说,正确地定义这个投影到地图的最佳方式policyHolder场我的内部Policy从外键值情况下类的一个实际的实例PolicyHolder案例类。


我们对这个问题的解决方案是将外键id放在case类中,然后使用lazy val或def(后者可能由缓存支持)来使用键检索记录。 假设你的PolicyHolder存储在一个单独的表中 - 如果它们PolicyHolder规范化的,但你想将它们视为单独的案例类,那么你可以在Policy构建一个新的案例类而不是检索记录使用外键。

class PolicyDAO(tag: Tag) extends Table[Policy](tag, "POLICIES") with DbConfig {
  def address = column[String]("ADDRESS", O.PrimaryKey)
  def policyHolderId = column[String]("POLICY_HOLDER_ID")

  def created = column[RichDateTime]("CREATED")
  def duration = column[String]("DURATION")

  def * = (address, policyHolderId, created, duration) <> (Policy.apply, Policy.unapply)
}

case class Policy(address : Future[Address], policyHolderId : Future[String], created : RichDateTime, duration : RichDuration ) {
  lazy val policyHolder = policyHolderId.map(id => PolicyHolderDAO.get(id))
}

我们还使用了一组通用的create / update / delete方法来说明嵌套,以便在提交Policy时它的内部PolicyHolder也将被提交; 我们使用了扩展TableCommonDAO类,并创建了create / update / delete方法的原型,然后所有的DAO扩展了CommonDAO而不是Table并根据需要CommonDAO了create / update / delete。


编辑:为了减少错误并减少我们不得不编写的样板文件数量,我们使用了Slick的代码生成工具 - 这种方式可以从模式中自动生成CRUD操作

链接地址: http://www.djcxy.com/p/23551.html

上一篇: Defining projection to map to nested case classes

下一篇: Jenkins's builds are blocked "Option code: 65002"