2010-09-20 11 views
15

Grails में, क्या कॉलम के आकार को सीमित करने का कोई तरीका है जिस पर enum मैप किया गया है। निम्न उदाहरण में, मैं स्तंभ प्रकार चाहते हैं होने के लिए चार (2)Grails Enum मैपिंग

enum FooStatus { 
    BAR('br'), TAR('tr') 
    final static String id 
} 

class Foo { 
    FooStatus status 

    static constraints = { 
     status(inList:FooStatus.values()*.id,size:2..2) 
    } 
} 

दोनों inList और आकार कोई असर जब स्कीमा निर्यात की जरूरत नहीं है, स्तंभ प्रकार उसके डिफ़ॉल्ट मान रखता है (varch (255)) शायद मैं ऐसा कर सकता हूं अगर मैं एक नया उपयोगकर्ता टाइप परिभाषित करता हूं। कोई उपाय ?

आप -ken

उत्तर

20

मुझे नहीं लगता कि यह तरीका enums GORM में आंतरिक रूप से उल्लेख किया जाता है को देखते हुए सीधे संभव है है धन्यवाद। लेकिन इस के लिए कोड को बदलने के काम करता है:

enum FooStatus { 
    BAR('br'), 
    TAR('tr') 
    private FooStatus(String id) { this.id = id } 
    final String id 

    static FooStatus byId(String id) { 
     values().find { it.id == id } 
    } 
} 

और

class Foo { 
    String status 

    FooStatus getFooStatus() { status ? FooStatus.byId(status) : null } 
    void setFooStatus(FooStatus fooStatus) { status = fooStatus.id } 

    static transients = ['fooStatus'] 

    static constraints = { 
     status inList: FooStatus.values()*.id 
    } 

    static mapping = { 
     status sqlType: 'char(2)' 
    } 
} 

क्षणिक गेटर जोड़ना और सेटर आप सेट या या तो स्ट्रिंग (आईडी) या enum लाभ उठा सकें।

+0

यह काफी कष्टप्रद मैं हर enum के लिए जोड़ने के लिए एक गेटर और एक सेटर टाइप करें और इसे "क्षणिक" यह घोषणा की है कि है। बर्ट, कस्टम यूजर टाइप एक और सुरुचिपूर्ण समाधान नहीं होगा? – ken

+0

क्षणिक और गेटर/सेटर वैकल्पिक हैं यदि आप Enum की आईडी सेट करने और कॉलिंग कोड में आईडी को एनम उदाहरण में परिवर्तित करने के ठीक हैं। असली परिवर्तन Enum की बजाय एक स्ट्रिंग को जारी रख रहा है (जो कि आपके लिस्ट() के उपयोग से निहित था, क्योंकि इससे एन्म के साथ काम नहीं करेगा)। लेकिन निश्चित रूप से, एक कस्टम उपयोगकर्ता टाइप काम करना चाहिए। यदि आप इसे एक से अधिक बार करते हैं तो आप सामान्य सामान को बेस क्लास में निकालना चाहते हैं। मेरी वरीयता डोमेन वर्ग में सबकुछ रखना संभव होगा, जब तक कि परिवर्तन महत्वपूर्ण न हों। –

+0

बर्ट, हाँ आप सही हैं, मैं एक एनम के रूप में स्थिति चर सेट करने और प्राप्त करने में सक्षम होना चाहता हूं और इस प्रकार डेटाबेस को सहेजने में भी सक्षम हूं, इस प्रकार एनम में आईडी का उपयोग। मैं मैपिंग = {स्थिति प्रकार: EnumUserType} – ken

11

ग्रेल्स एक अनियंत्रित (जहां तक ​​मैं वैसे भी बता सकता हूं) के साथ जहाजों के लिए कस्टम हाइबरनेट मैपिंग। कक्षा org.codehaus.groovy.grails.orm.hibernate.cfg.IdentityEnumType है। यह आपको कॉलम आकार सेट करने नहीं देगा, लेकिन आपके मॉडल में क्षणिक फ़ील्ड जोड़ने के बिना प्रत्येक enum मान के लिए डीबी में संग्रहीत किए गए परिवर्तन को बदलने में आसान बनाता है।

import org.codehaus.groovy.grails.orm.hibernate.cfg.IdentityEnumType 

class MyDomainClass { 
    Status status 

    static mapping = { 
     status(type: IdentityEnumType) 
    } 

    enum Status { 
     FOO("F"), BAR("B") 
     String id 
     Status(String id) { this.id = id } 
    } 
} 

आप एक Bootstrap.groovy में 'तालिका में परिवर्तन' चला सकते हैं स्तंभ हटना:

DataSource dataSource 
... 
Sql sql = new Sql(dataSource) 
sql.execute("alter table my_domain_class change column status status varchar(1) not null") 
+0

आप किस संस्करण के बारे में बात कर रहे हैं? – genuinefafa

+0

क्या आप Grails संस्करण के बारे में पूछ रहे हैं? 2.2.1 और अन्य –

+0

मुझे काम करने के लिए एक और फाइल में अपना enum घोषित करना पड़ा! – lfrodrigues

2

भी आसान (काम करता है कम से कम Grails 2.1.0+ में)

class DomainClass { 
    Status status 
    static mapping = { 
     status(enumType: "string") 
    } 
} 

enum Status { 
    OPEN  ("OPEN"), 
    CLOSED ("CLOSED"), 
    ... 

    String name 
    Status (String name) { 
     this.name = name 
    } 
} 
1

चूंकि GORM 6.1 पहचान enum मैपिंग के साथ सक्षम किया जा सकता है इस तरह के निर्माण

static mapping = { 
    myEnum enumType:"identity" 
} 

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

  • कोई संबंधित समस्या नहीं^_^