Scala Slick和我的数据库中的复杂类型

时间:2013-08-14 14:14:43

标签: scala slick

我对Scala和Slick都很陌生,在尝试学习它时,我正在编写一个适用于简单数据库的小应用程序。

我以前的大多数经验都来自.Net和实体框架,所以我想知道是否在实体框架中使用ComplexType属性,如果Slick允许我这样做。

基本上我的一个表是1-1关系,对于其中一些我更喜欢创建一个对象并将其用作复杂类型。显然在数据库中这只是表上的额外列,但我想知道Slick是否可以将这些列映射到我的Table类中的对象。见下面的例子。

我将使用博客条目示例。

扩展Table的主要类是BlogEntry,它包含条目的文本。然后说我想在该类中另一个名为EntryDetails的类,其中包含条目发布的时间和上次更新的时间。

在数据库中,所有这些字段都在同一个表中,但在读入时,它将是一个包含另一个对象的对象。 Slick有可能吗?

1 个答案:

答案 0 :(得分:6)

我认为这解决了你的问题

 trait Mapping {
  //Need to change JdbcDriver to the driver that you will use in your code (MySql, Postgres, etc)

  import scala.slick.driver.JdbcDriver.profile.simple._

  // Models
  case class EntryDetails(createDate: Option[DateTime] = None, updateDate: Option[DateTime] = None)

  case class Entry(id: Int, text: String, details: EntryDetails)

  //Implicit Joda Mappers for datetime columns
  implicit def timestamp2dateTime = MappedColumnType.base[DateTime, Timestamp](
    dateTime => new Timestamp(dateTime.getMillis),
    date => new DateTime(date))

  //Table mapping
  class Entries(tag: Tag) extends Table[Entry](tag, "entry") {
    def entryDetails = (createDate, updateDate) <>(EntryDetails.tupled, EntryDetails.unapply)

    def * = (id, text, entryDetails) <>(Entry.tupled, Entry.unapply)

    val id: Column[Int] = column[Int]("id")
    val text: Column[String] = column[String]("text")
    val createDate: Column[Option[DateTime]] = column[Option[DateTime]]("createDate")
    val updateDate: Column[Option[DateTime]] = column[Option[DateTime]]("updateDate")
  }

  //Table query, used in slick 2.0 for querying a table
  lazy val EntryTableQuery = TableQuery[Entries]
}

我将所有内容都包含在特征映射中,以便为您的答案打包代码。 据我所知,你想要将一个表映射到两个对象,一个在另一个内,这可以通过创建另一个映射方法来实现,这里称为entryDetails,它将表查询映射到EntryDetails模型对象。然后,您可以将此映射方法添加到对象映射*方法中。 entryDetails方法只是该映射方法的另一个参数。