2013-10-09 5 views
24

में enum मूल्य लागू करने के लिए कैसे:मैं पालन enum है चालाक

object LoginStatus extends Enumeration() with BitmaskedEnumeration { 
    type LoginStatus = Value 
    val Active = Value("A") 
    val Inactive = Value("I") 
} 

मैं 'ए' enum का मूल्य लागू करने के लिए की जरूरत है, लेकिन जब एसक्यूएल उत्पन्न होता है परिणाम 0. यह है है टेबल मैपिंग:

object LoginTable extends Table[Login]("login") { 
    def idLogin = column[Int]("idlogin", O.PrimaryKey, O.AutoInc) 
    def cdLogin = column[String]("cdlogin", O.NotNull) 
    def cdPass = column[String]("cdPass", O.NotNull) 
    def stLogin = column[LoginStatus]("stlogin", O.NotNull, O.DBType("character(1)")) 
} 

एनम मूल्य को कैसे जारी रखें?

मैं

implicit val charMapper = MappedTypeMapper.base[Char, String](
    b => b.toString(), 
    i => i.charAt(0)) 

    implicit def enum2StringMapper(enum: Enumeration) = MappedTypeMapper.base[enum.Value, Char](
    b => b.toString.charAt(0), 
    i => enum.withName(i.toString)) 

    implicit val LoginStatusMapper = enum2StringMapper(LoginStatus) 

लागू किया लेकिन परिणाम में:

implicit val LoginStatusTypeMapper = MappedTypeMapper.base[LoginStatus.Value, Int]( 
    // conversion from LoginStatus to int 
    { 
    status => status.id 
    }, 
    // conversion back from int to enum 
    { 
    id => LoginStatus(id) 
    } 
) 

तो आप के रूप में अपने स्तंभ को संदर्भित करने की जरूरत है:

[error] c.Login - Invalid value for type int : A 
+0

यह कुछ हद तक संबंधित है http://stackoverflow.com/questions/19030875/how-can-i-create-a-custom-column-type-with-typesafe-slick-in-scala/19040124#19040124 – cvogt

+0

यह स्लिम मेलिंग सूची https://groups.google.com/d/msg/scalaquery/Cd5iG-tJchM/fEIhq8IPVJQJ – cvogt

+0

पर भी चर्चा की गई है http://stackoverflow.com/questions/18752929/how-to-use से संबंधित -enums-in-scala-slick – cvogt

उत्तर

18

मैं व्यक्तिगत रूप से स्काला का गणन वर्ग से अपने खुद के वर्ग इनहेरिट करने का सुझाव देते हैं क्योंकि तब आप हर एक enum आप उपयोग कर अंत के लिए मानचित्रकारों बनाने के लिए की जरूरत नहीं है:

+०१२३५१६४१०६

यहाँ चालाक 2.0 कोड है कि मैं इस समय का उपयोग कर रहा है:

abstract class DBEnum extends Enumeration { 

    import slick.jdbc.MappedJdbcType 
    import slick.driver.JdbcDriver.simple._ 

    implicit val enumMapper = MappedJdbcType.base[Value, Int](_.id, this.apply) 
} 

यह भी (मैं इसे परीक्षण नहीं किया) चालाक 1.0 में काम करना चाहिए:

abstract class DBEnum extends Enumeration { 
    implicit val enumMapper = MappedTypeMapper.base[Value, Int](_.id, this.apply) 
} 

अब बस आपको अपने enums के लिए की जरूरत है सिर्फ डीबीएनम से प्राप्त करने के लिए है और इसे बहुत सारे बॉयलर प्लेट पर काटा जाना चाहिए।

तदनुसार कोड संपादित करें यदि आप इन्ट्स के बजाय स्ट्रिंग मानों का उपयोग करना चाहते हैं।

+0

tks @prakhunov, मैंने आपके कोड को कोड जोड़ने के लिए संपादित किया जो मैंने तारों के साथ काम करने के लिए बदल दिया। – Longo

+5

नोट करें कि यह कोड https://github.com/slick/slick/issues/540 के कारण वर्तमान रिलीज़ के साथ काम नहीं कर रहा है। आपको त्रुटि मिलती है 'jdbcProfile में scala.slick.driver.JdbcTypesComponent $ MappedJdbcType टाइप करने के लिए कोई TypeInfo नहीं है ...' इसके आसपास पाने के लिए, 'jdbc' के बजाय आयात को अपने विशेष डीबी ड्राइवर में बदलें। जैसे 'scala.slick.driver.HsqldbDriver.simple._' आयात करें और 'scala.slick.driver आयात करें। HsqldbDriver आयात करें।MappedJdbcType' – Luciano

+0

आप सही हैं मैंने देखा कि जब मैंने अपनी परियोजना को अंतिम स्लॉट 2.0 रिलीज़ में अपडेट किया था। हमने मूल रूप से कई डेटाबेस का समर्थन करने की योजना बनाई थी जो दुख की बात नहीं है। – prakhunov

4

शायद तुम एक TypeMapper अपने enum प्रकार के लिए बना सकते हैं :

columnLoginStatus.Value

इस तरह से यह डेटाबेस से डेटा लोड करते समय वापस आपके enum में बदल जाएगा। आप DB में पात्रों के रूप में अपने मूल्यों के भंडारण पर जोर देते हैं, तो आप सिर्फ एक नक्शाकार है कि एक चार के नक्शे बना सकते हैं और कुछ मदद मैं समाधान के बाद अपने

+0

मैंने एक मैपर लागू किया, लेकिन परिणामस्वरूप त्रुटि हुई: – Longo

2

परिभाषित करने की जरूरत, enum:

object LoginStatus extends Enumeration { 

    def enum2StringMapper(enum: Enumeration) = MappedTypeMapper.base[enum.Value, String](
    b => b.toString, 
    i => enum.withName(i)) 

    implicit val LoginStatusMapper = enum2StringMapper(LoginStatus) 

    type LoginStatus = Value 
    val Active = Value("A") 
    val Inactive = Value("I") 
} 

और टेबल मानचित्रण:

import constants.LoginStatus._ 
... 
    def stLogin = column[LoginStatus]("stlogin", O.NotNull, O.DBType("character(1)"))