2009-11-12 10 views
5

Grails GORM डेटाबेस में अमूर्त डोमेन कक्षाओं को जारी नहीं रखता है, जिससे बहुलक संबंधों में ब्रेक होता है। उदाहरण के लिए: org.hibernate.MappingException: तालिका दस्तावेज़ से एक संघ एक तुच्छ वर्ग को दर्शाता है: उपयोगकर्ता ... 25 अधिक 2009-11-GORM रिलेशनशिप में सार कक्षाएं

abstract class User { 
    String email 
    String password 
    static constraints = { 
     email(blank:false, nullable:false,email:true) 
     password(blank:false, password:true) 
    } 

    static hasMany = [membership:GroupMembership] 
} 

class RegularEmployee extends User {} 

class Manager extends User { 
    Workgroup managedGroup 
} 

class Document { 
    String name 
    String description 
    int fileSize 
    String fileExtension 
    User owner 
    Date creationTime 
    Date lastModifiedTime 
    DocumentData myData 
    boolean isCheckedOut 
    enum Sensitivity {LOW,MEDIUM,HIGH} 
    def documentImportance = Sensitivity.LOW 

    static constraints = { 
     name(nullable:false, blank:false) 
     description(nullable:false, blank:false) 
     fileSize(nullable:false) 
     fileExtension(nullable:false) 
     owner(nullable:false) 
     myData(nullable:false) 
    } 
} 

की वजह का कारण बनता है 11 23: 52: 58,933 [मुख्य] ​​ERROR mortbay.log - org.springframework.beans.factory. में स्थित है। बीनक्रिएशन अपवाद: नाम 'संदेश स्रोत' के साथ बीन बनाने में त्रुटि: बीन विफल होना; नेस्टेड अपवाद org.springframework.beans.factory.BeanCreationException: त्रुटि नाम 'लेनदेन प्रबंधक' नाम से बीन बनाना: बीन संपत्ति 'sessionFactory' सेट करते समय संदर्भ बीन 'सत्र फैक्टरी' को हल नहीं कर सकता; नेस्टेड अपवाद org.springframework.beans.factory.BeanCreationException: त्रुटि नाम 'सत्र फैक्टरी' के साथ बीन बनाना: इनिट विधि विफलता का आमंत्रण विफल रहा; नेस्टेड अपवाद org.hibernate.MappingException है: उपयोगकर्ता:: org.hibernate.MappingException: तालिका दस्तावेज़ से एक संघ एक तुच्छ श्रेणी को संदर्भित करता तालिका दस्तावेज़ से एक संघ एक तुच्छ वर्ग को दर्शाता है: उपयोगकर्ता

लेकिन इस परिदृश्य में, मैं किसी भी उपयोगकर्ता को किसी दस्तावेज़ को रखने की अनुमति देने के पॉलीमोर्फिक प्रभाव चाहता हूं, जबकि सिस्टम के प्रत्येक उपयोगकर्ता को परिभाषित भूमिकाओं में से एक में फिट करने के लिए मजबूर करना पड़ता है। इसलिए, उपयोगकर्ता को तुरंत तत्काल नहीं किया जाना चाहिए और सार बना दिया जाना चाहिए।

मैं एक गैर-अमूर्त उपयोगकर्ता वर्ग में भूमिकाओं के लिए एक enum का उपयोग नहीं करना चाहता, क्योंकि मैं विभिन्न भूमिकाओं में अतिरिक्त गुण जोड़ने में सक्षम होना चाहता हूं, जो कुछ संदर्भों में समझ में नहीं आ सकता है (मैं नहीं ' मैं एक एकल उपयोगकर्ता को नियमित रूप से नियोक्ता के लिए सेट सेट करना चाहता हूं जो किसी भी तरह से शून्य प्रबंधित समूह नहीं मिलता है)।

क्या यह Grails में एक बग है? क्या मैं कुछ भूल रहा हूँ?

+0

मुझे आश्चर्य है कि एक सार वर्ग के लिए डीबी को बनाए रखने का क्या अर्थ होगा, क्योंकि वहां कुछ जारी रहना है (यानी, एक उदाहरण)। –

+0

ठीक है, मैं उद्यम करता हूं कि एक सार वर्ग प्रारंभिक स्कीमा रूपरेखा है, खासकर अगर यह विरासत संबंध की जड़ पर है। इसलिए यदि मेरे पास उपयोगकर्ता-> नियमित कर्मचारी संबंध है, तो तालिका का नाम उपयोगकर्ता होना चाहिए और "वर्ग" के लिए एक कॉलम जोड़ा जाना चाहिए, जिसका प्रयोग मानक तालिका-प्रति-पदानुक्रम मॉडल को लाए जाने के लिए किया जाता है। –

उत्तर

3

आप शिरो, निंबल (शिरो का उपयोग करता है), और/या स्प्रिंग सुरक्षा प्लगइन्स के लिए डोमेन मॉडल देखना पसंद कर सकते हैं। वे एक ठोस उपयोगकर्ता डोमेन और एक ठोस भूमिका डोमेन बनाते हैं। विशेष रूप से शिरो कई उपयोगकर्ता मैपिंग के लिए UserRole डोमेन बनाता है।

फिर अपने रोल डोमेन पर, आप जो भी गुण चाहते हैं उसे जोड़ सकते हैं। यदि आवश्यक हो, तुम इतनी तरह मनमाने ढंग से संपत्तियों के लिए अनुमति देने के लिए एक अलग डोमेन बना सकते हैं:

class Role { 
    //some properties 
    static hasMany = [roleProperties:RoleProperty, ...] 
} 

class RoleProperty { 
    String name 
    String value 
    static belongsTo = [role:Role] 
} 

मुझे नहीं लगता है कि तुम क्या आप हालांकि अपने वर्तमान डोमेन मानचित्रण में के लिए देख रहे मिलेगा है।

+0

शिरो, निंबल और स्प्रिंग सिक्योरिटी पर मुझे बड़ी कॉल (मुझे लगता है कि यह एसीगी है?) प्लग-इन। मैं उनके बीच तुलना की तलाश में हूं लेकिन मुझे जो कुछ मिल रहा है वह 2K7 से मेलिंग सूचियों के लिए पुरानी पोस्टिंग है, जो शायद आधुनिक Grails के लिए सीमित प्रयोज्यता है। क्या आपको किसी भी संसाधन के बारे में पता चल जाता है जो साइड-बाय-साइड तुलना प्रदान करता है? –

+0

नहीं, मुझे उन सभी पर व्यापक तुलना कभी नहीं मिली है। मैंने पहले शिरो (जेएसईसीटीसी के रूप में) का उपयोग किया है, इसलिए जब इस साल की शुरुआत में निंबल की घोषणा की गई थी तो यह एक प्राकृतिक चाल की तरह लग रहा था (शिरो पर एक बहुत अधिक फीचर सेट के साथ बनाया गया था)। मैंने कभी स्प्रिंग सिक्योरिटी (उर्फ एसीगी) के बारे में पोस्ट देखी है लेकिन इसके बारे में कभी और नहीं पढ़ा है। –

2

हम पॉलिमॉर्फिज्म को देखने के लिए दूसरे दिन काम पर विरासत विरासत विरासत का परीक्षण कर रहे थे। हमें निम्नलिखित परिदृश्य मिलते हैं:

सार सुपरक्लास - सबक्लासिस माता-पिता के व्यवहार का उत्तराधिकारी है लेकिन माता-पिता को उस सबक्लास को संदर्भित करने के लिए उपयोग नहीं किया जा सकता है जिसे आप डेटाबेस में संग्रहीत करना चाहते हैं।

टेबल के साथ सुपरक्लास पीरहेरैरार्की झूठी - उप-वर्ग माता-पिता के फ़ील्ड को माता-पिता की तालिका में संग्रहीत करते हैं, पॉलिमॉर्फिज्म अपेक्षा के अनुसार काम करता है।

तालिका के साथ खाली सुपरक्लास, पेपरहेरार्ची झूठी - सबक्लास अपने टेबल में अपने सभी डेटा स्टोर करते हैं, पॉलिमॉर्फिज्म अपेक्षा के अनुसार काम करता है।

तो आपके मामले में, यदि आप उपयोगकर्ता वर्ग से अमूर्त कीवर्ड को निकालना चाहते थे तो सब कुछ अपेक्षित काम करेगा। केवल नकारात्मकता उपयोगकर्ता के सभी फ़ील्ड को उपयोगकर्ता तालिका में संग्रहीत किया जाता है, जिसमें नियमित आईडी कर्मचारी को केवल आईडी और संस्करण कॉलम और प्रबंधक तालिका के साथ वर्कग्रुप पंक्ति का संदर्भ होता है।

+0

दिलचस्प है, लेकिन अमूर्त कीवर्ड को हटाने से उपयोगकर्ता ऑब्जेक्ट्स के त्वरण की अनुमति भी मिल जाएगी। इसका मतलब है कि ऐसे उपयोगकर्ता को बनाने का एक तरीका है जिसे स्पष्ट रूप से भूमिकाओं में से एक में मजबूर नहीं किया गया है, जो मेरे व्यापार तर्क का उल्लंघन करता है। –

+0

यह एक अच्छा मुद्दा है। मुझे लगता है कि आप एक स्पष्ट रचनाकार बनाकर उस पर पहुंच सकते हैं जो अपवाद फेंकता है, लेकिन फिर भी हम जो वास्तव में चाहते हैं वह एक सार वर्ग है। जो भी इसे पढ़ता है, उसके लिए जिरा पर इस मुद्दे के लिए मतदान करना सुनिश्चित करें। http://jira.codehaus.org/browse/GRAILS-5356 – Blacktiger

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