मेरे पास मेरे वेब ऐप में कुछ डोमेन मॉडल क्लास हैं जिनके पास एक पदानुक्रमिक संबंध है। एक का एक उदाहरण पदानुक्रमित श्रेणी संरचना है जो उपयोगकर्ता पोस्टिंग को वर्गीकृत करने के लिए उपयोग की जाती है।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 में कोई फ़ील्ड नहीं हो सकता है जो इसके उप-वर्ग का संदर्भ देता है।
यह किसी भी तरह * समान * दिखता है http://forums.sun.com/thread.jspa?threadID=5268944 (लेकिन संबंधित समस्या तय है)। क्या आप किसी अन्य प्रदाता के साथ प्रयास कर सकते हैं? –