Java 基于包含MappedSuperclass的元模型的JPA EntityGraph不可能?
我正在尝试使用类型安全方法Java 基于包含MappedSuperclass的元模型的JPA EntityGraph不可能?,java,jpa,entitygraph,Java,Jpa,Entitygraph,我正在尝试使用类型安全方法EntityGraph.addAttributeNodes(Attribute…Attribute)来构造实体图。我有一个带有@MappedSuperclass的类型层次结构,基本上如下所示: @MappedSuperclass public abstract class BaseEntity { @Id private int dbid; } @Entity public class Entity extends BaseEntity { p
EntityGraph.addAttributeNodes(Attribute…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;
}
要使其工作,方法签名是否需要如下所示:EntityGraph.addAttributeNodes(Attribute…Attribute)
?这是规范的缺陷还是我忽略了什么
在我看来,这是一个与所述问题相关的问题。正如该问题的作者所指出的,单一属性的标准APIget
方法确实使用了?super X
定义类型参数
但是,即使我添加了someAttribute
节点,仍然有一个有点难看的警告,我认为它最多只能被抑制:
graph.addAttributeNodes( Entity_.someAttribute ); // generates warning: "Type safety: A generic array of Attribute<Entity,?> is created for a varargs parameter"
graph.addAttributeNodes(Entity_u.someAttribute);//生成警告:“类型安全:已为varargs参数创建属性的通用数组”
我同意
显然,如果您将代码更改为
EntityGraph<BaseEntity> graph = em.createEntityGraph(BaseEntity.class);
graph.addAttributeNodes(BaseEntity_.dbid );
EntityGraph=em.createEntityGraph(BaseEntity.class);
graph.addAttributeNodes(BaseEntity.dbid);
然后它将编译。
问题似乎确实存在于spec/API中,其中EntityGraph的泛型类型应用于addAttributeNodes参数(因此不允许超类字段)。是的,它确实说“T”是根实体的类型,但这并不意味着他们希望人们总是使用MappedSuperclass
我还要确认,通过对属性generic type使用“?super T
”可以修复它(获取javax.persistence jar源代码并修改/重新运行)
我把它作为一个问题提出来,并不是说我建议屏息以待更新谢谢你把它提出来给规范人员。我想我也有一个类似的问题:有路径(我恐怕记不清了,但我相信我在本例中放弃了实体图的类型安全构造,而采用了在实体上使用@NamedEntityGraph的非安全方式。
EntityGraph<BaseEntity> graph = em.createEntityGraph(BaseEntity.class);
graph.addAttributeNodes(BaseEntity_.dbid );