2013-08-14 2 views
7

저는 Scala와 Slick에 매우 익숙하며 간단한 데이터베이스로 작동하는 작은 응용 프로그램을 작성하려고합니다.Scala 내 데이터베이스의 매끄럽고 복잡한 유형

내 이전의 경험 대부분이 .Net과 Entity Framework에서 비롯되었으므로 Slick이 동일한 작업을 수행 할 수 있도록 허용하는 경우 ComplexType 특성을 가진 Entity Framework와 같으면 궁금합니다.

기본적으로 내 테이블 중 하나는 1-1 관계이며 일부는 개체를 만들어 복합 유형으로 사용하는 것을 선호합니다. 분명히 데이터베이스에서 이것은 단지 테이블의 여분의 열입니다. 그러나 Slick이 해당 열을 내 Table 클래스의 개체에 매핑 할 수 있는지 궁금합니다. 아래 예를 참조하십시오.

블로그 항목 예를 사용합니다.

표를 확장하는 내 기본 클래스는 BlogEntry이고 항목의 텍스트를 포함합니다. 그런 다음 해당 클래스에서 항목이 게시 된 시간과 마지막으로 업데이트 된 시간을 포함하는 EntryDetails이라는 또 다른 클래스가 필요하다고 말합니다.

데이터베이스에서 모든 필드는 동일한 테이블에 있지만 읽을 때 다른 개체를 포함하는 하나의 개체가됩니다. 이것이 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] 
} 

나는 특성 매핑 모든 것을 포함를 해결할 수 있다고 생각합니다. 필자가 이해하는 한, 테이블을 두 객체 (하나는 다른 객체)에 매핑하고자합니다. 여기서는 entryDetails라는 다른 매핑 메소드를 만들어 EntryDetails 모델 객체에 테이블 쿼리를 매핑합니다. 그런 다음이 맵핑 메소드를 오브젝트 맵핑 인 * 메소드에 추가 할 수 있습니다. entryDetails 메소드는 해당 맵핑 메소드의 또 다른 매개 변수 일뿐입니다.

+0

달콤한 고마워요! :) 이것은 내가 당신을 대단히 고맙게 여기면서 찾고 있었던 것을했다. – twreid

관련 문제