我正在尝试在现实案例中使用 Slick 的提升嵌入方法(体育俱乐部成员个人数据的自我管理)。我已经设法从数据库中检索信息并更新记录(将成员实现为案例类并使用案例类复制方法,如下所示),但我很难找到实现成员修改的最佳方法自然的方式。
我考虑了 2 种可能性:1)保持类实例的不变性并实现通用设置器(参见代码) 2)使构造函数参数为“var”(什么会抑制不变性,因此不理想)
坚持选项 1,我想出了以下代码(摘录,不是整个源代码):
case class Member(id: Int, name: String, firstname: Option[String] = None,
birthDate: Option[Date] = None, gender: Option[String] = None, country: Option[String] = None,
healthNotes: Option[String]) {
// Just a try so far
def set(n: String = name, fn: Option[String] = firstname, bd : Option[Date] = birthDate)
(implicit session: Session) = {
val m = this.copy(id,n,fn,bd)
Members.update(m)
m
}
}
object Members extends Table[Member]("clubmembers")
with CayenneAutoPKSupport {
def id = column[Int]("Member_ID", O.PrimaryKey) // This is the primary key column
def name = column[String]("Name")
def firstname = column[Option[String]]("Firstname")
def birthDate = column[Option[Date]]("BirthDate")
def gender = column[Option[String]]("Gender")
def country = column[Option[String]]("Country")
def healthNotes = column[Option[String]]("HealthNotes")
// Every table needs a * projection with the same type as the table's type parameter
def * = id ~ name ~ firstname ~ birthDate ~ gender ~ country ~ healthNotes <> (Member.apply _, Member.unapply _)
}
这可以按预期工作,但我希望 set 方法的命名参数具有相同的名称(这会使调用更“自然”)。我尝试了以下(无济于事)
def set( name: String = this.name, …
这不会编译,我可以想象为什么编译器不高兴(OTOH 当前的实现似乎可以工作)但我也可以想象它可以工作。无论如何:有人看到实现这一目标的方法吗?
或者,作为实现 Slick 持久对象的可修改类实例的最佳实践,人们会推荐什么?
提前感谢您的任何提示。
问候