4

Slick DSL 允许两种方法在表中创建可选字段。

对于这个案例类:

case class User(id: Option[Long] = None, fname: String, lname: String)

您可以通过以下方式之一创建表映射:

object Users extends Table[User]("USERS") {
    def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
    def fname = column[String]("FNAME")
    def lname = column[String]("LNAME")
    def * = id.? ~ fname ~ lname <> (User, User.unapply _)
  }

  object Users extends Table[User]("USERS") {
    def id = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc)
    def fname = column[String]("FNAME")
    def lname = column[String]("LNAME")
    def * = id ~ fname ~ lname <> (User, User.unapply _)
  }
}

两者有什么区别?一种是旧方式,另一种是新方式,还是它们有不同的用途?

我更喜欢将身份定义为可选作为 id 定义的一部分的第二种选择,因为它更加一致。

4

1 回答 1

5

第一个中的.?运算符允许您将选择字段的选择推迟到定义预测的那一刻。有时这不是您想要的,但是将您的 PK 定义为 anOption可能有点有趣,因为人们可能期望 PK 为NOT NULL.

除了 之外,您还可以.?在其他投影中使用*,例如:

def partial = id.? ~ fname

然后你可以做Users.partial.insert(None, "Jacobus")而不用担心你不感兴趣的领域。

于 2012-11-13T12:37:40.850 回答