웹 응용 프로그램에 계층 적 관계가있는 도메인 모델 클래스가 몇 개 있습니다. 한 예로 사용자 게시를 분류하는 데 사용되는 계층 적 카테고리 구조가 있습니다.EclipseLink @MappedSuperclass 및 generics
일반적으로 이러한 클래스의 계층 적 특성과 관련된 논리가 있습니다. 그래서 로직을 일반 @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) { ...
}
서브 클래스는 다음 제네릭 형식 N으로 자신을주는 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와 비슷한 모양입니다 (단, 관련 문제는 수정 됨). 다른 공급자와 함께 시도해 볼 수 있습니까? –