java - 基于包含 MappedSuperclass 的元模型的 JPA EntityGraph 不可能吗?

标签 java jpa entitygraph

我正在尝试使用类型安全方法 EntityGraph.addAttributeNodes(Attribute<T, ?> ... attribute)用于构建我的实体图。我有一个带有 @MappedSuperclass 的类型层次结构基本上看起来像这样:

@MappedSuperclass
public abstract class BaseEntity
{
    @Id
    private int dbid;
}

@Entity
public class Entity extends BaseEntity
{
    private String someAttribute;
}

EclipseLink 创建了这个元模型:

@Generated(value="EclipseLink-2.5.2.v20140319-rNA", date="2015-08-07T10:46:31")
@StaticMetamodel(BaseEntity.class)
public abstract class BaseEntity_ { 
    public static volatile SingularAttribute<BaseEntity, Integer> dbid;
}

@Generated(value="EclipseLink-2.5.2.v20140319-rNA", date="2015-08-07T10:46:31")
@StaticMetamodel(Entity.class)
public class Entity_ extends BaseEntity_ {
    public static volatile SingularAttribute<Entity, String> someAttribute;
}

问题是我无法引用 dbid带有实体图 API 的属性:

EntityGraph<Entity> graph = em.createEntityGraph( Entity.class );
graph.addAttributeNodes( Entity_.dbid ); // does not compile: "The method addAttributeNodes(String...) in the type EntityGraph<Entity> is not applicable for the arguments (SingularAttribute<BaseEntity,Integer>)"

要使其工作,方法签名是否需要如下所示:EntityGraph.addAttributeNodes(Attribute<? super T, ?> ... attribute) ?这是规范的缺点还是我忽略了什么?

在我看来,这是一个与描述的问题相关的问题 here .正如该问题的作者指出的那样,Criteria API get单一属性的方法确实使用了 ? super X定义类型参数。

但即使我添加了 someAttribute节点,仍然有这个有点丑陋的警告,我认为最多只能抑制它:

graph.addAttributeNodes( Entity_.someAttribute ); // generates warning: "Type safety: A generic array of Attribute<Entity,?> is created for a varargs parameter"

最佳答案

我同意。

显然,如果您将代码更改为

EntityGraph<BaseEntity> graph = em.createEntityGraph(BaseEntity.class);
graph.addAttributeNodes(BaseEntity_.dbid );

然后它会编译。 问题确实似乎出在规范/API 中,其中将 EntityGraph 的泛型类型应用于 addAttributeNodes 参数(因此不允许父类(super class)字段)。是的,它确实说“T”是 root 实体的类型,但这并不意味着他们希望人们总是使用 MappedSuperclass?

我还要确认通过对属性泛型使用“?super T”可以修复它(获取 javax.persistence jar 源并修改/重新运行)。

我将其提升为 issue on JPA ,并不是说我建议屏住呼吸进行更新

关于java - 基于包含 MappedSuperclass 的元模型的 JPA EntityGraph 不可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31875092/

相关文章:

java - 类型不匹配错误 : Cannont convert from ArrayList<SubClass1> to List<SuperClass>

java - 将文本文件读取到数组 Java

java - JPA 实体图的目标是什么?

java - JTextArea 中的控制台 out.print

java - 如何编辑maven项目

java - 使用 EJB 3.0 删除数据库行

java - 具有多个应用程序上下文的 Spring MVC 应用程序

java - 如何将sql native 查询结果映射到spring jpa存储库中的DTO?

spring - 当我尝试使用 JPA EntityGraph 使用 2 个集合加载实体时,MultipleBagFetchException

spring-boot - findAll() 上的 @NamedEntityGraphs