在@MappedSuperclass上使用@NamedEntityGraph属性

时间:2015-01-14 13:14:40

标签: java hibernate jpa inheritance

我尝试了许多不同的东西并进行了大量研究,但仍未能完成以下工作:我想在实体上定义@NamedEntityGraph,但我引用的属性位于父类中,用@MappedSuperclass定义。

我有轻微的感觉(在检查代码如何构建实体图之后),这不起作用,但也许有人可以对它有所了解。

这里详细介绍了我们要做的事情(缩短了一些事情):

@MappedSuperclass
public class UserBase {
  private Long id;
  private String loginname;
  private String password;

  @ManyToMany(fetch = FetchType.LAZY)
  private Set<Role> roles;
  ....
}

实际实体:

@Entity
@NamedEntityGraph(
  name = "withRoles",
  attributeNodes = { @NamedAttributeNode("roles") })
public class User extends UserBase {
   ....
}

会发生什么,我们收到错误

Unable to locate Attribute with the the given name [roles] on this ManagedType [some.package.path.User]

单步执行图创建代码我可以看到它只查看类本身定义的属性,而不是超类型。我有可能以这种方式定义图形,这有效吗?

感谢任何提示!

3 个答案:

答案 0 :(得分:0)

尝试添加includeAllAttributes=true

@NamedEntityGraph(
  name = "withRoles",
  includeAllAttributes=true
  attributeNodes = { @NamedAttributeNode("roles") })

答案 1 :(得分:0)

似乎应该在基类中定义entityGraphs并将它们添加到所有属性中,并使用subclassSubgraphs

来检索子类

http://docs.oracle.com/javaee/7/api/javax/persistence/NamedEntityGraph.html

但是......我希望通过从带注释的类的实际子类中获取名称来使其工作方式不同。这样我就可以在子类中添加节点了。

它看起来像是另一种方式,所以你必须使你的基类注释依赖于子类的细节。

顺便说一句! otehr家伙的回答几乎是正确的,你只需删除attributeNodes = { @NamedAttributeNode("roles") })。父母的归属将在那里。

答案 2 :(得分:0)

您似乎遇到了Hibernate错误HHH-10261 - Creating an entity sub graph on inherited attribute fails,该错误已在Hibernate 5.0.8中修复。

注意:在the PR中添加的用于解决此问题的测试代码未包含对从超类继承的多对多属性的测试,因此有可能您会看到此错误