Scala Slick 3.0中的继承实现

Scala Slick 3.0中的继承实现,scala,slick,slick-3.0,Scala,Slick,Slick 3.0,拥有case类+光滑表映射 很多类使用相同的字段,比如 class T1(tag: Tag) extends Table[caseClassA](tag, "A") { def id = column[Option[Long]]("ID", O.PrimaryKey, O.AutoInc) def id1 = column[Long]("ID1", O.NotNull) def id2 = column[String]("ID2", O.NotNull) def idn =

拥有case类+光滑表映射

很多类使用相同的字段,比如

class T1(tag: Tag) extends Table[caseClassA](tag, "A") {
  def id = column[Option[Long]]("ID", O.PrimaryKey, O.AutoInc)

  def id1 = column[Long]("ID1", O.NotNull)

  def id2 = column[String]("ID2", O.NotNull)

  def idn = column[String]("IDn", O.NotNull)
}


class T2(tag: Tag) extends Table[caseClassB](tag, "B") {
  def id = column[Option[Long]]("ID", O.PrimaryKey, O.AutoInc)

  def id1 = column[Long]("ID1", O.NotNull)

  def id2 = column[String]("ID2", O.NotNull)

  def idn = column[String]("IDn", O.NotNull)
}
如何将
id、id1、id2、idn
移动到根线程

尝试

没有成功,有什么想法吗


比尔

您可以将这些字段提取到一个
特征
,该特征本身不必扩展

trait BasicT {
  def id = column[Option[Long]]("ID", O.PrimaryKey, O.AutoInc)

  def id1 = column[Long]("ID1", O.NotNull)

  def id2 = column[String]("ID2", O.NotNull)

  def idn = column[String]("IDn", O.NotNull)
}

class T1(tag: Tag) extends Table[caseClassA](tag, "A") with BasicT

class T2(tag: Tag) extends Table[caseClassB](tag, "B") with BasicT

您可以将这些字段提取到
特征
,该特征本身不必扩展

trait BasicT {
  def id = column[Option[Long]]("ID", O.PrimaryKey, O.AutoInc)

  def id1 = column[Long]("ID1", O.NotNull)

  def id2 = column[String]("ID2", O.NotNull)

  def idn = column[String]("IDn", O.NotNull)
}

class T1(tag: Tag) extends Table[caseClassA](tag, "A") with BasicT

class T2(tag: Tag) extends Table[caseClassB](tag, "B") with BasicT

为了能够使用
,您的特质必须知道它将混合到
实例中:

trait BasicT {
  self: Table[_] =>

  def id = column[Option[Long]]("ID", O.PrimaryKey, O.AutoInc)

  def id1 = column[Long]("ID1", O.NotNull)

  def id2 = column[String]("ID2", O.NotNull)

  def idn = column[String]("IDn", O.NotNull)
}

class T1(tag: Tag) extends Table[caseClassA](tag, "A") with BasicT
class T2(tag: Tag) extends Table[caseClassB](tag, "B") with BasicT

为了能够使用
,您的特质必须知道它将混合到
实例中:

trait BasicT {
  self: Table[_] =>

  def id = column[Option[Long]]("ID", O.PrimaryKey, O.AutoInc)

  def id1 = column[Long]("ID1", O.NotNull)

  def id2 = column[String]("ID2", O.NotNull)

  def idn = column[String]("IDn", O.NotNull)
}

class T1(tag: Tag) extends Table[caseClassA](tag, "A") with BasicT
class T2(tag: Tag) extends Table[caseClassB](tag, "B") with BasicT

考虑到抽象表实际上需要参数,也许抽象类是统一公共字段的更好选择

abstract class BasicTable[T](tag: Tag, tableName: String) 
    extends Table[T](tag, tableName) {

    def id = column[Option[Long]]("ID", O.PrimaryKey, O.AutoInc)

    def id1 = column[Long]("ID1")

    def id2 = column[String]("ID2")

    def idn = column[String]("IDn")

}

class T1(tag: Tag) extends BasicTable[caseClassA](tag, "A") {
    ...
    override def *  = ...
}

考虑到抽象表实际上需要参数,也许抽象类是统一公共字段的更好选择

abstract class BasicTable[T](tag: Tag, tableName: String) 
    extends Table[T](tag, tableName) {

    def id = column[Option[Long]]("ID", O.PrimaryKey, O.AutoInc)

    def id1 = column[Long]("ID1")

    def id2 = column[String]("ID2")

    def idn = column[String]("IDn")

}

class T1(tag: Tag) extends BasicTable[caseClassA](tag, "A") {
    ...
    override def *  = ...
}

这不起作用,因为
BasicT
没有
column
方法。这不起作用,因为
BasicT
没有
column
方法。