我在我的web應用程序中有幾個領域模型類與他們自己有層次關係。一個例子是用於分類用戶發佈的分層結構類別結構。EclipseLink @MappedSuperclass和泛型
有一些常見的與這些類的層次性有關的邏輯。所以我試圖將邏輯移入一個通用的@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給自己的泛型類型N:
@Entity
public class CategoryBean extends HierarchicalBaseEntity<CategoryBean> {
在Java這一切工作了相當乾淨。但不幸的是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)
真HierarchicalBaseEntity它不是一個在任何情況下,實體是一個@MappedSuperclass ..但有沒有辦法用泛型或其他方式做到這一點?看起來您的@MappedSuperclass中沒有引用其子類的字段。
這看起來與http://forums.sun.com/thread.jspa?threadID=5268944相似*,但相關問題已修復。你可以嘗試與另一個提供商? – 2010-08-08 22:52:24