【发布时间】:2015-07-05 11:50:11
【问题描述】:
我正在使用 Slick 3.0 并遵循 Slick Multi-DB Pattern 以便抽象出实际的 DB 驱动程序。我使用在单个对象 TypeMappers 中定义的几种类型映射。现在我也想从特定的 DB 驱动程序中抽象出这些类型映射。这就是为什么我将 TypeMappers 移到专用 trait 中的原因。我相信这是正确的方法,但我正在努力如何导入 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)
}
}
【问题讨论】: