2011-11-02 15 views
9

महत्व देता रहा दस्तावेजों की एक सरल शामिल पदानुक्रम है:हाइबरनेट 4: InheritanceType.JOINED discriminator स्तंभ बने

CREATE TABLE Documents 
(
    id INTEGER NOT NULL, 
    discriminator ENUM('official','individual','external') NOT NULL, 
    file_name VARCHAR(200) NOT NULL, 
    PRIMARY KEY (id) 
); 

CREATE SystemDocuments 
(
    id INTEGER NOT NULL, 
    binary_data BLOB NOT NULL, 
    PRIMARY KEY (id), 
    FOREIGN KEY (id) REFERENCES Documents (id) 
); 

CREATE ExternalDocuments 
(
    id INTEGER NOT NULL, 
    PRIMARY KEY (id), 
    FOREIGN KEY (id) REFERENCES SystemDocuments (id) 
); 

आप देख सभी उप टेबल करना है दस्तावेज़ मेज से एक ही आईडी साझा कर सकते हैं के रूप में। SystemDocuments के अलावा binary_data कॉलम और ExternalDocuments कोई नई गुण नहीं जोड़ता है। (यह भी ध्यान रखें दो पदानुक्रम 'official' और 'individual' यहाँ कोई प्रासंगिकता के हैं से दर्शाया जाता है में अन्य ठोस उप टेबल देखते हैं।)

यहाँ ऊपर तालिकाओं के लिए मैपिंग हैं:

Document.java:

@Entity 
@Table(name = "Documents") 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "discriminator", discriminatorType = DiscriminatorType.STRING) 
//@DiscriminatorOptions(force = true) // <-- Hibernate 4-specific annotation not inserting discriminator values 
public abstract class Document implements Serializable 
{ 
    @Id 
    @Column 
    protected Integer id; 

    @Column(name = "file_name") 
    protected String fileName; 

    ... 
} 

SystemDocument.java:

@Entity 
@Table(name = "SystemDocuments") 
public abstract class SystemDocument extends Document 
{ 
    @Lob 
    @Column(name = "binary_data") 
    protected byte[] binaryData; 

    ... 
} 

ExternalDocument.java:

@Entity 
@Table(name = "ExternalDocuments") 
@DiscriminatorValue(value = "external") 
public class ExternalDocument extends SystemDocument 
{ 
    ... 
} 

उत्तरार्द्ध वर्ग माना जाता है दस्तावेज़ 'discriminator स्तंभ मान 'external' को मैप किया जा सकता है। EntityManager के माध्यम से इकाइयों को ढूंढते समय। भेदभावकर्ताओं को सही ढंग से वापस कर दिया जाता है, वास्तव में वास्तव में क्योंकि मेरे परीक्षण डेटा के भेदभावकर्ताओं को डीबी में सही ढंग से शामिल किया गया है।

अब मैं जेपीए के माध्यम से प्रणाली और एक फ़ाइल अपलोडर में नए दस्तावेज़ों/फ़ाइलें सम्मिलित करने के लिए निम्नलिखित कोड का उपयोग करें:

... 

UploadedFile uf = event.getUploadedFile(); 

// set ID, file name, and binary data 
ExternalDocument detachedExternalDocument = 
    new ExternalDocument(1234567, uf.getName(), uf.getData()); 

docService.create(detachedExternalDocument); 

जब डीबी निरीक्षण लेकिन मैं देख सकता हूँ कि हाइबरनेट नहीं'external' सम्मिलित करता है Documents तालिका के discriminator कॉलम में भेदभाव मूल्य।

अतीत में इसके बारे में समस्याएं हैं, https://hibernate.onjira.com/browse/ANN-140 और हाल ही में हाइबरनेट 4 https://hibernate.onjira.com/browse/HHH-4358 के लिए देखें, तो संभावना है कि यह इस तरह से काम करना चाहिए।

मुझे वर्तमान हाइबरनेट 4 एपीआई डॉक्स में http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/annotations/DiscriminatorOptions.html मिला, लेकिन यह काम नहीं करता है (दस्तावेज़ कक्षा में @ डिस्मिमिनेटरऑप्शन देखें)।

मैं कैसे हाइबरनेट 4 discriminators कच्चे एनोटेशन का उपयोग कर सम्मिलित करने के लिए मिल सकता है?

नोट: मैं भेदभावकर्ता कॉलम को नियमित कॉलम के रूप में मैप करना नहीं चाहता हूं।

उत्तर

19

सबसे पहले, यह प्रश्न Discriminator in InheritanceType.JOINED का डुप्लिकेट है।

ऐसा लगता है कि जॉइनेड विरासत में भेदभाव करने वाले मूल्य जेपीए स्पेक द्वारा आवश्यक नहीं है।यहाँ है कि मैं क्या ईमेल के माध्यम से जेपीए विशेषज्ञ समूह का सदस्य से प्राप्त है या नहीं:

कल्पना एक कार्यान्वयन की आवश्यकता नहीं है शामिल विरासत को लागू करने के discriminator स्तंभ का उपयोग करने, हालांकि, इस धारणा है कि अगर @DiscriminatorColumn निर्दिष्ट किया जाता है है तो इसका इस्तेमाल किया जाएगा, यानी मूल्यों को लिखा जाएगा। हम स्पष्ट रूप से यह नहीं बताते हैं कि यदि कोड में @DiscriminatorColumn निर्दिष्ट किया गया है, तो इसका उपयोग किया जाना चाहिए, जैसे कि हम स्पष्ट रूप से यह नहीं बताते हैं कि अगर @ कॉलम या @ जॉइन कॉलम निर्दिष्ट किया गया है तो मान तालिका में संग्रहीत किया जाना चाहिए, लेकिन वहां है केवल इतना ही है कि हम निर्दिष्ट कर सकते हैं या निर्दिष्ट करना चाहिए। निम्नतम स्तर पर, भौतिकी और कारण के कुछ कानूनों को अभी माना जाता है।

हाथ में समस्या काफी देर के लिए हाइबरनेट साथ एक मुद्दा रहा है, यहाँ देखें:

https://hibernate.atlassian.net/browse/ANN-140

अस्वीकृति टिप्पणी:

EJB3 साथ discriminators के उपयोग की आवश्यकता नहीं है मैपिंग रणनीतियों में शामिल हों। यह ने को जॉइन मैपिंग रणनीति के निचले कार्यान्वयन के लिए अनुमति दी है जिसके लिए एक भेदभाव की आवश्यकता है। हाइबरनेट को भेदभाव करने की आवश्यकता नहीं है क्योंकि हाइबरनेट इन अन्य निम्न कार्यान्वयन से बेहतर है।

अंत केवल SINGLE_TABLE रणनीति एक discriminator स्तंभ की आवश्यकता है, शामिल बिना लागू किया जा सकता। वर्तमान में हाइबरनेट के साथ समस्या यह है कि यह @ डिस्क्रिमिनेटर कॉलम के साथ मैप किए गए जॉइनेड विरासत में उप-संस्थाओं को बनाए रखने पर असंगत डेटा का कारण बनता है, भले ही जेपीए स्पेक ने भेदभावकर्ता मूल्यों को जारी रखने की सिफारिश की हो, यदि भेदभावकर्ता के साथ जुड़ने के लिए उपयोग किया जाता है। RFE यहाँ में अधिक देखें:

https://hibernate.atlassian.net/browse/HHH-6911

+4

अतिरिक्त टिप्पणी है कि टिकट (HHH-6911) हाल ही में पर तैनात थे। ऐसा लगता है कि अब हाइबरनेट (4.2.9, 4.3.एक्स) कोड में स्पष्ट रूप से वर्णित होने पर भेदभावकर्ता कॉलम को अनदेखा नहीं करता है। – Andy

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