2013-08-14 2 views
7

मैं स्कैला और स्लिम दोनों के लिए बहुत नया हूं और इसे सीखने की कोशिश में मैं एक छोटा सा एप्लीकेशन लिख रहा हूं जो एक साधारण डेटाबेस के साथ काम करता है।मेरे डेटाबेस में स्कैला स्लिम और जटिल प्रकार

मेरा अधिकांश पिछला अनुभव नेट और एंटिटी फ्रेमवर्क से आता है, इसलिए मैं सोच रहा था कि ComplexType विशेषता के साथ एंटीटी फ्रेमवर्क की तरह अगर स्लिक मुझे ऐसा करने की अनुमति देगी।

मूल रूप से मेरी तालिकाओं में से एक 1-1 संबंध है और उनमें से कुछ के लिए मैं केवल एक वस्तु बनाना और इसे जटिल प्रकार के रूप में उपयोग करना पसंद करूंगा। स्पष्ट रूप से डेटाबेस में यह तालिका पर केवल अतिरिक्त कॉलम है, लेकिन मैं सोच रहा था कि क्या स्लिक उन कॉलम को मेरे Table कक्षा में किसी ऑब्जेक्ट पर मैप कर सकता है। नीचे उदाहरण देखें।

मैं एक ब्लॉग एंट्री उदाहरण का उपयोग करूंगा।

तालिका का विस्तार करने वाली मेरी मुख्य कक्षा BlogEntry है और इसमें प्रवेश का टेक्स्ट शामिल है। फिर कहें कि मैं उस कक्षा में EntryDetails नामक एक और कक्षा में चाहता था जिसमें प्रविष्टि पोस्ट की गई समय और आखिरी बार अपडेट किया गया था।

डेटाबेस में वे सभी फ़ील्ड एक ही टेबल में होंगे, लेकिन जब इसे पढ़ा जाएगा तो एक ऑब्जेक्ट अन्य ऑब्जेक्ट होगा। क्या यह स्लिम के साथ संभव है?

+1

हां, यह संभव है। इसके लिए आपको [कस्टम 'टाइपमैपर'] लागू करना होगा (http://slick.typesafe.com/doc/1.0.1/lifted-embedding.html#user-defined-functions-and-types)। (मैं बाद में एक असली जवाब लिखूंगा।) – Carsten

+0

बहुत बढ़िया धन्यवाद। हाँ जब आप करते हैं तो मैं इसे उत्तर के रूप में स्वीकार करूंगा। अपके इतने तेज़ जवाब के लिए आपका बहुत - बहुत धन्यवाद। – twreid

+0

क्या आपने टाइपमैपर के साथ अपनी समस्या हल की है? क्या आपको अभी भी नमूना की आवश्यकता है कि इसे कैसे करें? – 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] 
} 

मैं एक विशेषता मैपिंग में सब कुछ शामिल है, को हल करती है। जहां तक ​​मुझे समझा गया, आप एक टेबल को दो ऑब्जेक्ट्स में मैप करना चाहते हैं, एक दूसरे के अंदर, यह एक और मैपिंग विधि बनाकर हासिल किया जा सकता है, यहां एंट्री डिस्प्ले कहा जाता है, जो प्रविष्टि डिस्प्ले मॉडल ऑब्जेक्ट में तालिका प्रश्नों को मैप करता है। फिर आप इस मैपिंग विधि को अपने ऑब्जेक्ट मैपिंग, * विधि में जोड़ सकते हैं। विधि प्रविष्टि विवरण उस मैपिंग विधि का एक और पैरामीटर होगा।

+0

मीठे धन्यवाद! :) यह वही किया जो मैं आपको देख रहा था बहुत बहुत धन्यवाद। – twreid

संबंधित मुद्दे