我对Scala和Slick都是陌生的,在尝试学习它的同时,我正在编写一个适用于简单数据库的小型应用程序。
我以前的大部分经验来自.Net和实体框架,因此我想知道是否像Entity Framework中一样,ComplexType
如果Slick允许我这样做,是否具有该属性。
基本上,我的表之一是1-1关系,对于其中的一些表,我宁愿只创建一个对象并将其用作复杂类型。显然,在数据库中,这只是表上的多余列,但是我想知道Slick是否可以将这些列映射到Table
类中的对象。请参见下面的示例。
我将使用Blog输入示例。
我扩展Table的主类是BlogEntry
,它包含条目的文本。然后说我想要在该类中另一个名为该类的类EntryDetails
,其中包含条目的发布时间和上次更新的时间。
在数据库中,所有这些字段都将在同一个表中,但是在读入时,将是一个包含另一个对象的对象。Slick有可能吗?
我认为这可以解决您的问题
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将只是该映射方法的另一个参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句