2010-08-08 13 views
5

मेरे पास मेरे वेब ऐप में कुछ डोमेन मॉडल क्लास हैं जिनके पास एक पदानुक्रमिक संबंध है। एक का एक उदाहरण पदानुक्रमित श्रेणी संरचना है जो उपयोगकर्ता पोस्टिंग को वर्गीकृत करने के लिए उपयोग की जाती है।EclipseLink @MappedSuperclass और जेनेरिक

इन वर्गों की पदानुक्रमित प्रकृति से संबंधित कुछ तर्क सामान्य हैं। तो मैंने तर्क को एक सामान्य @ मैप्डसुपरक्लास एनोटेटेड सुपरक्लास में स्थानांतरित करने का प्रयास किया।

कुछ की तरह:

@MappedSuperclass 
public abstract class HierarchicalBaseEntity<N extends HierarchicalBaseEntity<N>> extends BaseEntity { 

@ManyToOne(optional=true) 
@JoinColumn(name="parent") 
private N parent; 
private int depth; 

public N getParent() { ... 
public void setParent(N newParent) { ... 

public boolean isRoot() { ... 
public int getDepth() { ... 

public boolean isDescendantOf(N ancestor) { ... 
public static <N extends HierarchicalBaseEntity<N>> N getCommonAncestor(N a, N b) { ... 
public static <N extends HierarchicalBaseEntity<N>> Collection<N> reduceToCommonAncestors(Collection<N> entities) { ... 
} 

उपवर्गों तो खुद को सामान्य प्रकार एन के रूप में दे रही है HierarchicalBaseEntity का विस्तार:

@Entity 
public class CategoryBean extends HierarchicalBaseEntity<CategoryBean> { 

जावा में यह सब काफी सफाई से बाहर काम करता है।

private N parent; 

यह निम्न अपवाद देता है::

Caused by: Exception [EclipseLink-7250] (Eclipse Persistence Services - 2.1.0.v20100614-r7608): org.eclipse.persistence.exceptions.ValidationException 
Exception Description: [class net.timp.yaase.core.model.HierarchicalBaseEntity] uses a non-entity [class java.lang.String] as target entity in the relationship attribute [field parent]. 
at org.eclipse.persistence.exceptions.ValidationException.nonEntityTargetInRelationship(ValidationException.java:1341) 
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.RelationshipAccessor.getReferenceDescriptor(RelationshipAccessor.java:416) 
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ObjectAccessor.processOneToOneForeignKeyRelationship(ObjectAccessor.java:609) 
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ObjectAccessor.processOwningMappingKeys(ObjectAccessor.java:678) 
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ManyToOneAccessor.process(ManyToOneAccessor.java:107) 

यह एक गैर इकाई स्ट्रिंग के बारे में क्यों शिकायत है लेकिन दुर्भाग्य से EclipseLink नहीं सामान्य 'माता-पिता' फ़ील्ड की तरह लगता है करता है?

एक परीक्षण जेनरिक को दूर करने और सिर्फ माता-पिता क्षेत्र के रूप में परिभाषित होने मैं कोशिश की है के रूप में:

Caused by: Exception [EclipseLink-7250] (Eclipse Persistence Services - 2.1.0.v20100614-r7608): org.eclipse.persistence.exceptions.ValidationException 
Exception Description: [class net.timp.yaase.core.model.OnymBean] uses a non-entity [class net.timp.yaase.core.model.HierarchicalBaseEntity] as target entity in the relationship attribute [field parent]. 
at org.eclipse.persistence.exceptions.ValidationException.nonEntityTargetInRelationship(ValidationException.java:1341) 
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.RelationshipAccessor.getReferenceDescriptor(RelationshipAccessor.java:416) 
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ObjectAccessor.processOneToOneForeignKeyRelationship(ObjectAccessor.java:609) 
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ObjectAccessor.processOwningMappingKeys(ObjectAccessor.java:678) 
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ManyToOneAccessor.process(ManyToOneAccessor.java:107) 

सच HierarchicalBaseEntity इसकी नहीं एक:

private HierarchicalBaseEntity parent; 

जेनरिक के बिना, EclipseLink इस अपवाद दिया किसी भी मामले में इकाई, @MappedSuperclass है .. लेकिन क्या जेनेरिक या अन्यथा ऐसा करने का कोई तरीका है? ऐसा लगता है कि आपके पास अपने @MappedSuperclass में कोई फ़ील्ड नहीं हो सकता है जो इसके उप-वर्ग का संदर्भ देता है।

+0

यह किसी भी तरह * समान * दिखता है http://forums.sun.com/thread.jspa?threadID=5268944 (लेकिन संबंधित समस्या तय है)। क्या आप किसी अन्य प्रदाता के साथ प्रयास कर सकते हैं? –

उत्तर

3

मुद्दा यह है कि जेनेरिक का उपयोग संबंधों के लिए फ़ील्ड प्रकार के रूप में करते समय EclipseLink को पता नहीं चल सकता कि वास्तविक प्रकार का निरीक्षण कब किया जाता है जब लक्ष्य प्रकार रनटाइम तक होता है। इसलिए मैपिंग को रनटाइम पर गतिशील रूप से बनाया जाना चाहिए और यह समर्थित नहीं है।

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

+0

हाय गॉर्डन, आपके उत्तर के लिए धन्यवाद। मैं उप-वर्गों में फ़ील्ड डालने के आपके सुझाव का प्रयास करूंगा .. मैं देख सकता हूं कि यह कैसे काम करेगा। मेरे पास वर्तमान में एक श्रेणीबद्ध एंटीटी इंटरफेस और तर्क के साथ एक स्थिर 'सहायक' वर्ग है। काम करता है, लेकिन यह उतना साफ नहीं है जितना मैं चाहूंगा। मैं सोच रहा था कि अगर किसी भी तरह से एसोसिएशन को फिर से परिभाषित करने के लिए @AssociationOverride का उपयोग किया जा सकता है .. –

+0

दुर्भाग्य से इस मामले में समस्या विशेषता प्रकार के साथ है। @AssociationOverrides का उपयोग डेटाबेस जानकारी को बदलने के लिए किया जाता है लेकिन लक्ष्य प्रकार निर्दिष्ट करने के लिए कोई विशेषता नहीं है। –

+0

हाय फिर गॉर्डन, मुझे अमूर्त गेटर्स के साथ सामान्य तर्क के लिए सुपरक्लास को लागू करने के लिए सुझाए गए सुझावों की तुलना में क्लीनर समाधान नहीं मिल रहा है। तो आप मेरा वोट प्राप्त करते हैं। Btw। क्या आप जानते हैं कि यह किसी अन्य जेपीए अपूर्णताओं में संभव है या यह जेपीए स्पेक का हिस्सा है? –

1

मुझे लगता है कि मुझे देर हो रही है, लेकिन लोगों को इस समस्या का जवाब (मेरे जैसे) की तलाश में इस पर एक नज़र रखना चाहिए: https://bugs.eclipse.org/bugs/show_bug.cgi?id=312132

-1

अन्य प्रदाता है कि एक लगातार संबंध में सामान्य प्रकार का समर्थन करता है OpenJPA । धारणा ओपनजेपीए बनाता है कि जेनेरिक टाइप फ़ील्ड एक सतत प्रकार है और इसे (ओपनजेपीए-विशिष्ट) @ टाइप एनोटेशन के रूप में एनोटेट किया जाना चाहिए।

यह @ टाइप एनोटेशन ओपनजेपीए मैपिंग इंजन के प्लेसहोल्डर के रूप में कार्य करता है, और मैपिंग रखता है जहां संदर्भ रनटाइम इंस्टेंस की निरंतर पहचान है। कई साल पहले, मैंने blog लिखा था; मैंने इसे फिर से आत्म-प्रचार के लिए उद्धृत नहीं किया है, लेकिन उम्मीद है कि यह एक सामान्य पट्टी का उपयोग करने के लिए कुछ मार्गों को इंगित कर सकता है, बिना किसी प्रकार के पदानुक्रम के नीचे ठोस प्रकार की जानकारी को धक्का देकर (और जेनेरिक-आधारित प्रकार मॉडल का सार खोना)।

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