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

时间:2015-08-07 10:05:35

标签: 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;
}

问题在于我无法使用实体图API引用dbid属性:

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"

1 个答案:

答案 0 :(得分:3)

我同意。

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

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

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

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

我把它提升为issue on JPA,而不是我建议屏住呼吸进行更新