我使用Slick 3.0并遵循Slick Multi-DB Pattern,以便抽象出实际的数据库驱动程序。我使用了几个类型映射,它们在单个对象TypeMappers中定义。现在我想从特定的DB驱动程序中抽象出这些类型映射。这就是我将TypeMappers转移到专用特征的原因。我相信这是正确的方法,但我正在努力如何导入TypeMappers,以便对类User可见隐含。任何帮助都会很棒。
trait TypeMappersTrait { this: Driver =>
import driver.api._
object TypeMappers {
implicit val JavaUtilDateTypeMapper = MappedColumnType.base[java.util.Date, Long](_.getTime, new java.util.Date(_))
implicit val URLMapper = MappedColumnType.base[URL, String](_.toString, new URL(_))
implicit val WrappedByteArrayTypeMapper = MappedColumnType.base[WrappedArray[Byte], Array[Byte]](_.toArray, wrapByteArray(_))
}
}
/** A User contains a name, picture and ID */
case class User(name: String, picture: Picture, id: Option[Int] = None)
/** UserComponent provides database definitions for User objects */
trait UserComponent { this: DriverComponent with PictureComponent =>
import driver.simple._
class Users(tag: Tag) extends Table[(String, Int, Option[Int])](tag, "USERS") {
def id = column[Option[Int]]("USER_ID", O.PrimaryKey, O.AutoInc)
def name = column[String]("USER_NAME", O.NotNull)
def pictureId = column[Int]("PIC_ID", O.NotNull)
def * = (name, pictureId, id)
}
val users = TableQuery[Users]
private val usersAutoInc =
users.map(u => (u.name, u.pictureId)) returning users.map(_.id)
def insert(user: User)(implicit session: Session): User = {
val pic =
if(user.picture.id.isEmpty) insert(user.picture)
else user.picture
val id = usersAutoInc.insert(user.name, pic.id.get)
user.copy(picture = pic, id = id)
}
}
答案 0 :(得分:1)
首先,我假设你在TypeMappersTrait中输入了一个拼写错误, Driver 实际上应该是 DriverComponent (所以这个自我类型匹配注释使用UserComponent)。
然后,您可以从对象TypeMappers中取消嵌套隐式类型映射器,以便它们直接位于TypeMappersTrait中,并通过以下方式将它们拉入:
trait UserComponent extends TypeMappersTrait