下面的代码显示了一个包含两个 Slick 表定义的模块(以特征的形式),第二个具有对第一个的 fk 引用。每个表对象定义一个称为 Id 的内部案例类,用作其主键。这一切都可以编译并且工作得很好。
trait SlickModule {
val driver = slick.driver.BasicDriver
import driver.Table
case class A(id: TableA.Id, name: String)
case class B(id: TableB.Id, aId: TableA.Id)
import scala.slick.lifted.MappedTypeMapper
implicit val aIdType = MappedTypeMapper.base[TableA.Id, Long](_.id, new TableA.Id(_))
implicit val bIdType = MappedTypeMapper.base[TableB.Id, Long](_.id, new TableB.Id(_))
object TableA extends Table[A]("table_a") {
case class Id(id: Long)
def id = column[TableA.Id]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name", O.NotNull)
def * = id ~ name <> (A.apply _, A.unapply _)
}
object TableB extends Table[B]("table_b") {
case class Id(id: Long)
def id = column[Id]("id", O.PrimaryKey, O.AutoInc)
def aId = column[TableA.Id]("fk_a", O.NotNull)
def fkA = foreignKey("fk_a", aId, TableA)(_.id)
def * = id ~ aId <> (B.apply _, B.unapply _)
}
}
但是,如果我将 TableA 中 id 的列定义从
def id = column[TableA.Id]("id", O.PrimaryKey, O.AutoInc)
为此,通过删除 Id 的显式路径
def id = column[Id]("id", O.PrimaryKey, O.AutoInc)
我收到以下编译错误:
type mismatch;
found : SlickModule.this.TableA.type => scala.slick.lifted.Column[x$5.Id] forSome { val x$5: SlickModule.this.TableA.type }
required: SlickModule.this.TableA.type => scala.slick.lifted.Column[SlickModule.this.TableA.Id]
Error occurred in an application involving default arguments.
def fkA = foreignKey("fk_a", aId, TableA)(_.id)
^
因此,aId 列的类型参数是沿着现在包含 TableA.type 的路径找到的,而该参数应该是 TableA.Id。谁能解释为什么会出现这种差异以及我如何在不需要显式引用 TableA 对象的情况下解决它?我试图将我的主键列的定义抽象为一个特征,而这个问题阻止了我这样做。
我正在使用 Scala 2.10.2 编译器。