हम अपने आवेदन में प्रत्येक तालिका के लिए एकल टेबल विरासत का उपयोग करते हैं। यह एक ही एप्लीकेशन स्टैक के विभिन्न उदाहरणों को उसी डीएओ के साथ काम करने की इजाजत देता है, जबकि उनकी इकाइयां उस उदाहरण के लिए अद्वितीय जानकारी वाले कुछ संभावित रूप से भिन्न हो सकती हैं। एक सार वर्ग बुनियादी तालिका संरचना को परिभाषित करता है और अगर है कि उदाहरण के लिए आवश्यक एक विस्तार, अतिरिक्त कॉलम परिभाषित करता है:क्या मैं हाइबरनेट एकल तालिका विरासत में भेदभावकर्ता स्तंभ को हटा सकता हूं?
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "client")
public abstract class Client extends AbstractPersistable<Long> {
// ...
}
आवेदन एक:
@Entity
public class ClientSimple extends Client {
private String name;
// getter, setter
}
आवेदन बी:
@Entity
public class ClientAdvanced extends Client {
private String description;
// getter, setter
}
अब एक डीएओ आवेदन ए और बी के लिए Client
ऑब्जेक्ट्स के साथ काम कर सकता है लेकिन एप्लिकेशन बी अपने क्लाइंट ऑब्जेक्ट के लिए अतिरिक्त जानकारी को परिभाषित कर सकता है जिसे मैनेजर विधि यूनिक द्वारा पढ़ा जा सकता है
आवेदन एक:: आवेदन बी ई
Client client = new ClientSimple();
clientDao.save(client);
आवेदन बी:
Client client = new ClientAdvanced();
clientDao.save(client);
दुर्भाग्य से इसका मतलब यह है कि हर तालिका में एक DTYPE स्तंभ (या किसी अन्य नाम है कि मैं चुन सकते हैं) है । क्या इससे छुटकारा पाने का कोई तरीका है? हमें इसकी आवश्यकता नहीं है और यह डीबी स्पेस का उपयोग कर रहा है ...
धन्यवाद!
संपादित
नोट करने के लिए महत्वपूर्ण: @MappedSuperclass
काम नहीं करेगा। हम QueryDSL हमारे एचक्यूएल एब्स्ट्रक्शन लेयर के रूप में उपयोग कर रहे हैं। क्वेरी सहेजने के लिए इसे स्वचालित रूप से जेनरेट की गई क्वेरी प्रकार कक्षाओं की आवश्यकता होती है। हालांकि, अगर अमूर्त वर्ग @Entity
के साथ एनोटेट किया गया है तो ये केवल सही ढंग से उत्पन्न किए जाएंगे।
यह neccessairy है क्योंकि हम सार वर्ग Client
के खिलाफ क्वेरी करने के लिए है, जबकि सच्चाई में आवेदन एक में ClientSimple
और ClientAdvanced
क्वेरी करने आवेदन बी में हैं:
तो किसी भी आवेदन में यह काम करेगा:
query.where(QClient.client.name.equals("something");
और आवेदन बी में यह काम करेगा:
query.where(QClientSimple.client.description.equals("something else");
EDIT2 - उबाल नीचे
यह इस के लिए नीचे उबालने के लिए लगता है: मैं तैनाती समय में हाइबरनेट एक निश्चित मूल्य के लिए एक inhertited इकाई के लिए discriminator प्रकार सेट करने के लिए कॉन्फ़िगर कर सकते हैं। तो मेरे उदाहरण के साथ एक Client
एक आवेदन में ClientSimple
और दूसरे में ClientAdvanced
होगा ताकि मुझे उस जानकारी को डेटाबेस में संग्रहीत करने की आवश्यकता न हो?
जैसा कि मैंने कहा था: प्रत्येक एप्लिकेशन बेस एप्लिकेशन स्टैक का एक उदाहरण होगा। प्रत्येक एप्लिकेशन अपने स्थानीय डेटाबेस के लिए अतिरिक्त कॉलम परिभाषित कर सकता है लेकिन सभी ऑब्जेक्ट्स उस उदाहरण के लिए एक ही प्रकार के होंगे, इसलिए हम गारंटी देते हैं कि भेदभावकर्ता हमेशा डेटाबेस में अनावश्यक बना देता है और हाइबरनेट कॉन्फ़िगरेशन के लिए उपयोग केस बनाता है।
आप किस क्वेरीबेल संस्करण का उपयोग कर रहे हैं? –
हम QueryDSL 2.2.3 का उपयोग कर रहे हैं, लेकिन अगर नए संस्करण मैप किए गए सुपरक्लास को क्वेरी लक्ष्यों के रूप में समर्थन देते हैं तो अपडेट कर सकते हैं: इस तरह: '@ मैपड सुपरपरक्लास @टेबल पब्लिक अमूर्त क्लास क्लाइंट ... '+' @ एंटीटी पब्लिक क्लास क्लाइंटसिंपल क्लाइंट का विस्तार करता है == > क्वेरी प्रकार उत्पन्न करें ... ==> क्वेरी: 'QClient.client.name' – Pete
यह सीधे समर्थित नहीं है, लेकिन आप इसके लिए गिटहब पर टिकट जोड़ सकते हैं। यह आसानी से लागू किया गया है। –