gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:40:50 25 4
gpt4 key购买 nike

我有这些案例类:

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 的实际实例的案例类案例类。

最佳答案

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

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也将被 promise ;我们使用了 CommonDAO扩展类 Table并拥有创建/更新/删除方法的原型(prototype),然后所有 DAO 都扩展了 CommonDAO而不是 Table并根据需要覆盖创建/更新/删除。

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

关于scala - 定义投影以映射到嵌套案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27203018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com