Tôi có một vài lớp mô hình miền trong ứng dụng web của tôi có mối quan hệ phân cấp với chính chúng. Một ví dụ về một là cấu trúc danh mục phân cấp được sử dụng để phân loại các bài đăng của người dùng.EclipseLink @MappedSuperclass và generics
Có một số logic liên quan đến bản chất phân cấp của các lớp này phổ biến. Vì vậy, tôi đã cố gắng chuyển logic thành một lớp siêu lớp được chú thích chung của lớp @MappedSuperclass.
Cái gì như:
@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) { ...
}
Các lớp con sau đó mở rộng HierarchicalBaseEntity cho bản thân như các loại generic N:
@Entity
public class CategoryBean extends HierarchicalBaseEntity<CategoryBean> {
Trong Java này tất cả các công trình ra khá sạch sẽ. Nhưng tiếc là EclipseLink không dường như thích chung 'mẹ' lĩnh vực:
private N parent;
Nó cung cấp cho các ngoại lệ sau đây:
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)
Tại sao nó phàn nàn về một String phi thực thể?
Là một thử nghiệm tôi đã cố gắng loại bỏ các Generics và chỉ có đồng ruộng cha mẹ được định nghĩa là:
private HierarchicalBaseEntity parent;
Nếu không có Generics, EclipseLink cho ngoại lệ này:
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)
Đúng HierarchicalBaseEntity của nó không phải là một Thực thể trong cả hai trường hợp, là một @MappedSuperclass .. nhưng có cách nào để làm điều này với Generics hay không? Có vẻ như bạn không thể có một trường trong lớp @MappedSuperclass tham chiếu đến một trong các lớp con của nó.
Điều này có vẻ bằng cách nào đó * tương tự * với http://forums.sun.com/thread.jspa?threadID=5268944 (nhưng vấn đề liên quan đã được khắc phục). Bạn có thể thử với nhà cung cấp khác không? –