7

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

我以前的大部分经验都来自 .Net 和 Entity Framework,所以我想知道ComplexType如果 Slick 允许我做同样的事情,是否像 Entity Framework 中的属性一样。

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

我将使用博客条目示例。

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

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

4

1 回答 1

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 将只是该映射方法的另一个参数。

于 2014-03-21T12:35:26.680 回答