2013-08-14 19 views
7

Hem Scala hem de Slick için çok yeni ve öğrenmeye çalışırken çok basit bir veritabanıyla çalışan küçük bir uygulama yazıyorum.Scala Veritabanımdaki slicker ve karmaşık tipler

Önceki deneyimimin birçoğu Net ve Entity Framework'den geliyor, bu yüzden Slick'in aynı şeyi yapmama izin vermesi durumunda ComplexType özniteliğiyle Entity Framework'teki gibi olup olmadığını merak ediyorum.

Temelde tablolarımdan biri 1-1 ilişkisidir ve bazıları için sadece bir nesne oluşturmayı ve onu karmaşık bir tür olarak kullanmayı tercih ederim. Açıkçası veritabanında bu sadece ekstra sütunlar masaya, ama ben Slick Table sınıfında bir nesne için bu sütunları eşleyebiliriz merak ediyorum. Aşağıdaki örneğe bakın.

Blog giriş örneği kullanacağım.

Tabloyu genişleten ana sınıfım BlogEntry ve giriş metni içeriyor. Daha sonra, bu sınıfta, girişin kaydedildiği zamanı ve en son güncellendiği zamanı içeren EntryDetails adlı başka bir ders istediğimi söyle.

Veritabanında, tüm bu alanlar aynı tabloda olacak, ancak okunurken diğer nesneyi içeren bir nesne olacaktır. Bu Slick ile mümkün mü?

+1

Evet, bu mümkün. Bunun için [özel bir 'TypeMapper'] (http://slick.typesafe.com/doc/1.0.1/lifted-embedding.html#user-defined-functions-and-types) uygulamanız gerekir. (Daha sonra gerçek bir cevap yazacağım.) – Carsten

+0

Awesome Çok teşekkür ederim. Evet, ne zaman istersen cevap olarak kabul edeceğim. Hızlı cevabınız için teşekkür ederiz. – twreid

+0

Sorununuzu TypeMapper ile çözdünüz mü? Hala nasıl yapılacağı konusunda bir örneğe ihtiyacınız var mı? – dirceusemighini

cevap

5

Bunun Cevabınız için kod paketlemek için sorununuzu

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

Ben bir özellik Mapping her şeyi dahil, çözer diye düşünüyorum. Anladığım kadarıyla, bir tabloyu diğerinin içinde iki nesneye eşlemek istiyorsunuz. Bu, giriş sorguları olarak adlandırılan ve girişleri EntryDetails model nesnesine eşleyen başka bir eşleme yöntemi oluşturarak elde edilebilir. Ardından bu eşleme yöntemini nesne eşlemenize * yöntemine ekleyebilirsiniz. Method entryDetails, bu haritalama yönteminin sadece bir başka parametresi olacaktır.

+0

Sweet teşekkür ederim! :) Aradığım şeyi yaptım çok teşekkür ederim. – twreid