سؤال

لديّ عدد قليل من فئات نموذج المجال في تطبيق الويب الخاص بي والتي لها علاقة هرمية بأنفسهم. مثال على واحد هو بنية الفئة الهرمية المستخدمة لتصنيف منشورات المستخدمين.

هناك بعض المنطق المتعلق بالطبيعة الهرمية لهذه الطبقات الشائعة. لذلك حاولت نقل المنطق إلى @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) { ...
}

ثم تمتد الفئات الفرعية على الحمية الهرمية التي تمنح نفسها كنوع عامة ن:

@Entity
public class CategoryBean extends HierarchicalBaseEntity<CategoryBean> {

في جافا كل هذا يعمل بشكل نظيف تماما. لكن لسوء الحظ ، لا يبدو أن Eclipselink يحب حقل "الوالد" العام:

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)

لماذا تشكو من سلسلة غير دخول؟

كاختبار ، حاولت إزالة الأدوية الجيرية وعدد الحقل الأصل على أنه:

private HierarchicalBaseEntity parent;

بدون الأعياد ، أعطى 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)

الحمية الهرمية الحقيقية ، إنها ليست كيانًا في كلتا الحالتين ، هل @mappedsuperclass .. ولكن هل هناك طريقة للقيام بذلك مع الأدوية العامة أو غير ذلك؟ يبدو أنه لا يمكنك الحصول على حقل في mappedsuperclass الذي يشير إلى إحدى الفئة الفرعية.

هل كانت مفيدة؟

المحلول

تكمن المشكلة في أنه عند استخدام Generics كنوع حقل للعلاقات ، لا يمكن أن يعرف Eclipselink ما هو نوع الهدف حتى وقت التشغيل عند فحص المثيل الفعلي. لذلك يجب إنشاء التعيين ديناميكيًا في وقت التشغيل وهذا غير مدعوم.

يمكنك الاستمرار في استخدام الطبقة الفائقة العامة ، لكن هذا سيتطلب نقل الحقل إلى الكيانات التي سيكون لها أنواع محددة ثم يكون لها getters/المستقلين الداخليين التجريديين لتلك الحقول التي ترجع كائنًا والتي ستدعوها الطرق العامة إلى النوع العام. معقدة ولكنها ستسمح بالشكل العام.

نصائح أخرى

أعتقد أنني متأخر ، لكن الأشخاص الذين يبحثون عن الإجابة على هذه المشكلة (مثلي) يجب عليهم إلقاء نظرة على هذا:https://bugs.eclipse.org/bugs/show_bug.cgi؟id=312132

المزود الآخر الذي يدعم النوع العام في علاقة مستمرة هو OpenJPA. الافتراض الذي يقوم به OpenJPA هو أن حقل النوع العام هو نوع ثابت ويتم شرحه على هذا النحو مع توضيح Type (OpenJPA الخاص).

يعمل هذا التعليق التوضيحي هذا كصاحب نائب لمحرك رسم الخرائط OpenJPA ، ويحمل رسم خرائط حيث يكون الإشارة هوية مستمرة لمثيل وقت التشغيل. منذ عدة سنوات ، كتبت أ مقالات; ؛ أذكرها هنا مرة أخرى ليس للترويج الذاتي ، ولكن على أمل أن يشير ذلك إلى بعض المسارات لدعم شجرة عامة دون الحاجة إلى دفع معلومات النوع الخرساني إلى أسفل التسلسل الهرمي (وبالتالي فقدان نموذج نموذج النوع العام ).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top