महत्व देता रहा दस्तावेजों की एक सरल शामिल पदानुक्रम है:हाइबरनेट 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 कच्चे एनोटेशन का उपयोग कर सम्मिलित करने के लिए मिल सकता है?
नोट: मैं भेदभावकर्ता कॉलम को नियमित कॉलम के रूप में मैप करना नहीं चाहता हूं।
अतिरिक्त टिप्पणी है कि टिकट (HHH-6911) हाल ही में पर तैनात थे। ऐसा लगता है कि अब हाइबरनेट (4.2.9, 4.3.एक्स) कोड में स्पष्ट रूप से वर्णित होने पर भेदभावकर्ता कॉलम को अनदेखा नहीं करता है। – Andy