基于包含 MappedSuperclass 的元模型的 JPA EntityGraph 不可能吗?
JPA EntityGraph based on meta model containing MappedSuperclass not possible?
我正在尝试使用类型安全方法 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"
我同意。
显然,如果您将代码更改为
EntityGraph<BaseEntity> graph = em.createEntityGraph(BaseEntity.class);
graph.addAttributeNodes(BaseEntity_.dbid );
然后它会编译。
问题确实似乎出在 spec/API 中,其中将 EntityGraph 的泛型类型应用于 addAttributeNodes 参数(因此不允许超类字段)。是的,它确实说 "T" 是 root 实体的类型,但这并不意味着他们希望人们总是使用 MappedSuperclass?
我还要确认,通过使用“? super T
”作为属性泛型类型可以修复它(采用 javax.persistence jar 源和 modifying/rerunning)。
我把它作为 issue on JPA 提出来了,并不是说我建议屏住呼吸进行更新
我正在尝试使用类型安全方法 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"
我同意。
显然,如果您将代码更改为
EntityGraph<BaseEntity> graph = em.createEntityGraph(BaseEntity.class);
graph.addAttributeNodes(BaseEntity_.dbid );
然后它会编译。 问题确实似乎出在 spec/API 中,其中将 EntityGraph 的泛型类型应用于 addAttributeNodes 参数(因此不允许超类字段)。是的,它确实说 "T" 是 root 实体的类型,但这并不意味着他们希望人们总是使用 MappedSuperclass?
我还要确认,通过使用“? super T
”作为属性泛型类型可以修复它(采用 javax.persistence jar 源和 modifying/rerunning)。
我把它作为 issue on JPA 提出来了,并不是说我建议屏住呼吸进行更新