2013-08-14 11 views
7

私はScalaとSlickの両方にとって非常に新しく、それを学ぼうとして、私は簡単なデータベースで動作する小さなアプリケーションを書いています。Scala私のデータベースの滑らかで複雑なタイプ

私の以前の経験のほとんどは.NetとEntity Frameworkから来ているので、Slickが同じことをすることができるなら、ComplexType属性を持つEntity Frameworkのようなものかどうか疑問に思っていました。

基本的に私のテーブルの1つは1-1の関係であり、そのうちのいくつかについては、オブジェクトを作成して複合タイプとして使用する方が好きです。明らかにデータベースではこれはテーブル上の余分な列ですが、Slickがそれらの列を私のTableクラスのオブジェクトにマップできるかどうか疑問に思っていました。以下の例を参照してください。

ブログエントリの例を使用します。

テーブルを拡張する私のメインクラスはBlogEntryであり、エントリのテキストを含んでいます。次に、そのクラスに、EntryDetailsという別のクラスがあり、エントリが投稿された時刻と最後に更新された時刻が含まれていたとします。

データベースでは、これらのフィールドはすべて同じテーブルにありますが、読み込み時には他のオブジェクトを含む1つのオブジェクトになります。これはSlickでも可能ですか?

+1

はい、可能です。そのためにはカスタム[TypeMapper'を実装する必要があります(http://slick.typesafe.com/doc/1.0.1/lifted-embedding.html#user- defined-functions-and-types)。 (本当の答えは後で書きます) – Carsten

+0

大変ありがとうございます。あなたがそうするとき、私は答えとしてそれを受け入れるでしょう。迅速な返信をありがとうございます。 – twreid

+0

TypeMapperで問題を解決しましたか?それを行う方法のサンプルがまだ必要ですか? – dirceusemighini

答えて

5

私はこれがあなたの問題を解決することを考えて

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

私はあなたの答えのためのコードをパックするために、形質マッピングのすべてを含みます。 私が理解する限り、テーブルを2つのオブジェクトにマッピングしたいとします。これはentryDetailsという別のマッピングメソッドを作成することで実現できます。このメソッドは、テーブルクエリをEntryDetailsモデルオブジェクトにマッピングします。次に、このマッピングメソッドをオブジェクトマッピング、*メソッドに追加できます。メソッドentryDetailsは、そのマッピングメソッドのもう1つのパラメータになります。

+0

甘いありがとう! :)これは私があなたに非常に感謝のために探していたことでした。 – twreid

関連する問題