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

scala – 定义投影以映射到嵌套的case类

发布时间:2020-12-16 19:14:57 所属栏目:安全 来源:网络整理
导读:我有这些案例类: case class PolicyHolder(id : String,firstName : String,lastName : String)case class Policy(address : Future[Address],policyHolder : Future[PolicyHolder],created : RichDateTime,duration : RichDuration ) 然后我为Policy定义了
我有这些案例类:

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

对我来说,正确定义此投影以将Policy Case类中的policyHolder字段从外键值映射到PolicyHolder案例类的实际实例的最佳方法是什么.

解决方法

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

class PolicyDAO(tag: Tag) extends Table[Policy](tag,O.PrimaryKey)
  def policyHolderId = column[String]("POLICY_HOLDER_ID")

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

  def * = (address,policyHolderId,Policy.unapply)
}

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

我们还使用了一组通用的创建/更新/删除方法来计算嵌套,因此当提交策略时,它的内部PolicyHolder也将被提交;我们使用扩展Table的CommonDAO类,并拥有创建/更新/删除方法的原型,然后所有DAO扩展了CommonDAO而不是Table,并根据需要覆盖create / update / delete.

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

(编辑:李大同)

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

    推荐文章
      热点阅读