2012-06-29 30 views
7

मुझे आश्चर्य है कि कैसे जेनेरिक के साथ एक अमूर्त वर्ग जेपीए के साथ संभालेगा? मेरा मतलब है कि मुझे इस क्षेत्र के लिए किस प्रकार की टिप्पणियों की आवश्यकता है?जेपीए और जेनेरिक

@MappedSuperclass 
public abstract class AbstractMyClass<T> { 
    // What about Strings and Integers? Do I need some kind of @LOB? 
    private T field; 

    public T getField() { 
    return field; 
    } 

    public void setField(T field) { 
    this.field = field; 
    } 
} 

और फिर इन

@Entity 
@Table(name = "String") 
public class MyStringClass extends AbstractMyClass<String> { 
} 

@Entity 
@Table(name = "Integer") 
public class MyIntegerClass extends AbstractMyClass<Integer> { 
} 
+0

आप किस कार्यान्वयन का उपयोग करते हैं? – JMelnik

+0

डेटाबेस के रूप में ओरेकल 10 जी के साथ 3.6 हाइबरनेट। इसके अलावा, मैं हाथ से मैन्युअल रूप से टेबल उत्पन्न करता हूं। – jaakko

+0

आप डिज़ाइन स्तर पर क्या हासिल करने की कोशिश कर रहे हैं? ऐसे सुपरक्लास होने का क्या मतलब है? –

उत्तर

5

जेपीए पूरी तरह से क्योंकि सार श्रेणी स्तर पर और अपने ठोस वर्ग के लिए सामान्य दिखाई देता है यह वास्तव में है अपने प्रस्तावित संभाल करने में सक्षम है:

इन पर विचार करें प्रति वर्ग एक मूल्य। वास्तव में, जेपीए आपके उप-वर्गों को एक या अधिक तालिका में संग्रहीत करेगा, आपके द्वारा चुने गए @InheritanceStrategy के अनुसार और इसके लिए विभिन्न तंत्र का उपयोग करता है।

आप बाहर अपने आप को समझ सकते हैं कि आपका मामला एक समस्या नहीं है, कैसे एक ORM एक डीबी पर दो वर्गों को बचा सकता है के बारे में तर्क:

  • आप एक ही तालिका में MyStringClass और MyIntegerClass स्टोर कर सकते हैं, एक को जोड़ने भेदभाव कॉलम ताकि ओआरएम, जब यह डीबी से लोड हो, पता है कि किस कन्स्ट्रक्टर को बुलाया जाना चाहिए।
  • आप प्रत्येक सबक्लास को अधिक तालिका में स्टोर कर सकते हैं।

क्या संभव नहीं है, दूसरी तरफ, परिभाषित करने के लिए एक सामान्य

@Entity 
@Table(name = "MyGenericClass") 
public class MyGenericClass<T> { 
    private T t; 
    public MyGenericClass(T t) { 
     this.t=t; 
    } 
} 

इस का कारण यह है कि, संकलन समय पर, टी प्रकार विलोपन की वजह से "मिट" जाता है। इसका उपयोग हस्ताक्षर और प्रकार की शुद्धता को सत्यापित करने के लिए संकलित समय पर किया जाता है, लेकिन फिर इसे java.lang.Jbject में जेवीएम के अंदर बदल दिया जाता है। आप अब तक का पालन करें, तो आप को समझने के लिए निम्नलिखित सक्षम होना चाहिए:

  • आपके मामले में, AbstractMyClass के हर ठोस उपवर्ग एक प्रकार टी जो वर्ग के सभी उदाहरणों के लिए परिभाषित किया गया है है। जबकि टी सूचना को सार MyClass में नहीं रखा गया है, यह उपclasses के अंदर बनाए रखा और अद्वितीय है।
  • दूसरे मामले में मैंने पोस्ट किया है, MyGenericClass के प्रत्येक संभावित ठोस उदाहरण के लिए टी के लिए एक संभावित अलग-अलग मूल्य हो सकता है, और टाइप एरर के कारण यह जानकारी बरकरार नहीं है।

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


अतिरिक्त: आप वास्तव में मिटाने के लिए जावाप का उपयोग कर सकते हैं। MyGenericClass से एनोटेशन लें और इसे संकलित करें।

G:\>javac MyGenericClass.java 

G:\>javap -p MyGenericClass 
Compiled from "MyGenericClass.java" 
public class MyGenericClass extends java.lang.Object{ 
    private java.lang.Object t; 
    public MyGenericClass(java.lang.Object); 
} 
+0

मैं इस की कोशिश की है और यह एक अपवाद @Entity @Table (नाम = "MyFoo") सार्वजनिक वर्ग MyFooClass AbstractMyClass फैली निर्मित { } की वजह से: org.hibernate.MappingException: के लिए प्रकार का निर्धारण नहीं किया जा सका: fukoka.foobar.Foo, तालिका में: MyFoo, कॉलम के लिए: [org.hibernate.mapping.Column (फ़ील्ड)] – user1885834

-2

हम कर सकते हैं। यदि T लागू Serializable

@Entity 
public class IgsSubject extends BasicObject implements Serializable{ 

    private static final long serialVersionUID = -5387429446192609471L; 

@MappedSuperclass 
public class IgsBasicLog<T> extends BasicObject { 

    @ManyToOne 
    @JoinColumn(name = "ITEM_ID") 
    private T item; 

@Entity 
public class IgsLogA extends IgsBasicLog<IgsSubject> implements Serializable { 
    private static final long serialVersionUID = -8207430344929724212L; 
} 
+0

अधिक कोड समझाएं ... – Raymond

+0

कृपया बताएं कि क्यों 'टी 'को' Seralizable' को लागू करने की आवश्यकता है क्योंकि इसे आवश्यकतानुसार एक इकाई प्रकार का विस्तार करने के लिए। –

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