如何使用Slick Multi-DB Pattern的类型映射器?

时间:2015-06-02 15:56:01

标签: scala slick

我使用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)
  }
}

1 个答案:

答案 0 :(得分:1)

首先,我假设你在TypeMappersTrait中输入了一个拼写错误, Driver 实际上应该是 DriverComponent (所以这个自我类型匹配注释使用UserComponent)。

然后,您可以从对象TypeMappers中取消嵌套隐式类型映射器,以便它们直接位于TypeMappersTrait中,并通过以下方式将它们拉入:

trait UserComponent extends TypeMappersTrait