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

时间:2014-11-29 13:51:35

标签: scala slick-2.0

我有这些案例类:

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

然后我为Policy

定义了一个光滑的模式
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的实际实例的最佳方法是什么?案例类。

1 个答案:

答案 0 :(得分:3)

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

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))
}

我们还使用了一组通用的创建/更新/删除方法来考虑嵌套,因此当提交Policy时,其内部PolicyHolder也将被提交;我们使用扩展CommonDAO的{​​{1}}类,并使用创建/更新/删除方法的原型,然后所有DAO扩展Table而不是CommonDAO并覆盖create /必要时更新/删除。


编辑:为了减少错误并减少我们必须编写的样板量,我们使用了Slick的code generation tool - 这样就可以从架构中自动生成CRUD操作