- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的 Web 应用程序中有几个领域模型类,它们之间存在层次关系。其中一个例子是用于对用户帖子进行分类的分层类别结构。
有一些与这些类的层次结构相关的逻辑是常见的。因此,我尝试将逻辑移动到通用的 @MappedSuperclass 注释父类(super class)中。
类似的东西:
@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)
True HierarchicalBaseEntity 在任何一种情况下都不是实体,是@MappedSuperclass..但是有没有办法用泛型或其他方式做到这一点?您的 @MappedSuperclass 中似乎没有字段引用它的子类之一。
最佳答案
问题是,当使用泛型作为关系的字段类型时,EclipseLink 直到运行时检查实际实例时才能知道目标类型是什么。因此映射必须在运行时动态创建,这是不支持的。
您可以继续使用通用父类(super class),但这需要将字段移动到实体,在那里它们将定义类型,然后为那些返回对象的字段具有抽象的内部 getter/setter,通用方法将调用转换为通用类型。令人费解,但它会允许通用 MappedSuperclass。
关于java - EclipseLink @MappedSuperclass 和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3435760/
在 JPA/Hibernate 中,像 BetterBaseEntity 这样的映射父类(super class)可以是另一个映射父类(super class) BaseEntity 的子类吗? 我想
我在 Symfony 5 中与 MappedSuperclass 的多对一关系存在问题。我有实体 Employee、Employer,它扩展了 MappedSuperclass 抽象类 Person。
伙计们! 如果我定义一个实体类并用 @MappedSuperclass 注释它和一个 @EntityListener ,在子类中是否还会调用监听器来处理生命周期事件? 例子: @MappedSuper
我在搜索从@MappedSuperclass 扩展的实体时遇到了问题。我创建了一个类 PhoneBook 并从中扩展了 2 个实体:FirstPhoneBook 和 SecondPhoneBook。结
我有一个映射父类(super class) @MappedSuperclass public class A{ . . . @Column(name="somethin
我想知道是否有办法在继承 MappedSuperClass 的子类中更改(或定义内部)注释,例如,假设我们有一个类 BaseUser(mappedsuperclass),一个子类 User :
我有一些表有一些公共(public)列,我认为在创建实体时我会让实体扩展一个定义了所有映射的类: @MappedSuperclass public class AbstractLogMaster im
假设我有一个 JPA 实体: @Entity @Table(name = "PARENT") public class Parent { // ... } 有没有办法,也许是特定于 Hiber
我正在努力创建一些抽象类来抽象每个实体将共享的属性,例如 ID。 我创建了一个 AbstractModel 类,如下所示。 import javax.persistence.*; import jav
我想与双方的同一个表创建ManyToMany关系。它应该代表两个用户之间的友谊。我现在有用户类别: @Entity @Table(name = "Users") public class User e
我的 Web 应用程序中有几个领域模型类,它们之间存在层次关系。其中一个例子是用于对用户帖子进行分类的分层类别结构。 有一些与这些类的层次结构相关的逻辑是常见的。因此,我尝试将逻辑移动到通用的 @Ma
问题 我有一个名为 Data 的 @MappedSuperclass 作为我数据库中每个实体的父级。它包含 Id 等公共(public)属性。然后我有一个扩展 Data 的实体,由于其子类的公共(pu
我有一个摘要TemporalModel向所有扩展模型添加 created 和 updated 字段的类(用 @MappedSuperclass 注释)。我想给它添加一个 getLatest() 静态方
我需要关联 @OneToMany 从 Country 到父类(super class) Place (@MappedSuperclass)。它可以是双向的。我需要像 @OneToAny 这样的东西。
有: @MappedSuperclass class Superclass { @Id @Column(name = "id") protected long id;
我有一个场景,我需要使用 Doctrine 的 MappedSuperclass 功能(使用 Symfony2),并在一些父类(super class)列上创建一个唯一约束。比方说: use Doct
我将 JPA2 与 Hibernate 一起使用,并尝试为我的实体引入一个公共(public)基类。到目前为止,它看起来像这样: @MappedSuperclass public abstract c
我可以在父类和子类中定义相同的 JPA 回调方法吗?如果是,我是否需要调用 super.onPrePersist();在子类的 onPrePersist() 方法中? @MappedSuperclas
我正在使用 JPA 2.0 和 EclipseLink 2.2.0。 我有一个 @MappedSuperclass,AbstractEntity,它是我所有提供 PK 和审计列的实体的基础。 我想让另
@MappedSuperclass public abstract class AbstractBaseModel{ } @MappedSuperclass public class Person e
我是一名优秀的程序员,十分优秀!