Scala Slick и сложные типы в моей базе данных

Я очень новичок в Scala и Slick, и, пытаясь выучить его, я пишу небольшое приложение, которое работает с простой базой данных.

Большая часть моего предыдущего опыта пришла из .Net и Entity Framework, поэтому мне было интересно, как в Entity Framework с атрибутом ComplexType если Слик позволит мне сделать то же самое.

В основном одна из моих таблиц - это отношение 1-1, и для некоторых из них я бы предпочел просто создать объект и использовать его как сложный тип. Очевидно, что в базе данных это просто дополнительные столбцы в таблице, но мне было интересно, может ли Slick отобразить эти столбцы на объект в моем Table учебный класс. Смотрите пример ниже.

Я буду использовать пример записи в блоге.

Мой основной класс, который расширяет Table - это BlogEntry, и он содержит текст записи. Затем скажите, что я хотел в этом классе другой класс с именем EntryDetails, который содержал время публикации записи и время ее последнего обновления.

В базе данных все эти поля будут находиться в одной таблице, но при считывании в ней будет один объект, содержащий другой объект. Это возможно с Slick?

7 голосов | спросил twreid 14 PM00000060000004331 2013, 18:14:43

1 ответ


0

Я думаю, что это решит вашу проблему

 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]
}

Я включил все в черту Mapping, чтобы упаковать код для вашего ответа. Насколько я понял, вы хотите отобразить таблицу на два объекта, один внутри другого, это может быть достигнуто путем создания другого метода отображения, здесь называемого entryDetails, который сопоставляет запросы таблицы с объектом модели EntryDetails. Затем вы можете добавить этот метод сопоставления к вашему объектному сопоставлению, метод *. Метод entryDetails будет просто еще одним параметром этого метода отображения.

ответил dirceusemighini 21 MarpmFri, 21 Mar 2014 16:35:26 +04002014-03-21T16:35:26+04:0004 2014, 16:35:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132