我有一个实体 Ride ,它嵌入了一个可嵌入的“实体”路线。 Route 有一个具有ManyToMany关系的List属性 towns ,所以它有fetchtype LAZY(我不想使用EAGER)。所以我想为实体 Ride 定义一个NamedEntityGraph,加载带有 Route 的 Ride 对象,带有城镇的即时列表。 但是当我部署战争时,我得到了这个例外:
java.lang.IllegalArgumentException:属性[route]不是托管类型
路线
@Entity
@NamedQueries({
@NamedQuery(name = "Ride.findAll", query = "SELECT m FROM Ride m")})
@NamedEntityGraphs({
@NamedEntityGraph(
name = "rideWithInstanciatedRoute",
attributeNodes = {
@NamedAttributeNode(value = "route", subgraph = "routeWithTowns")
},
subgraphs = {
@NamedSubgraph(
name = "routeWithTowns",
attributeNodes = {
@NamedAttributeNode("towns")
}
)
}
)
})
public class Ride implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Embedded
private Route route;
// some getter and setter
}
路线
@Embeddable
public class Route implements Serializable {
private static final long serialVersionUID = 1L;
@ManyToMany
private List<Town> towns;
// some getter and setter
}
答案 0 :(得分:6)
看看Hibernate对org.hibernate.jpa.graph.internal.AttributeNodeImpl的实现,我们得出的结论是@NamedAttributeNode
不能:
@Embedded
)@ElementCollection
注释)if (attribute.getPersistentAttributeType() == Attribute.PersistentAttributeType.BASIC ||
attribute.getPersistentAttributeType() == Attribute.PersistentAttributeType.EMBEDDED ) {
throw new IllegalArgumentException(
String.format("Attribute [%s] is not of managed type", getAttributeName())
);
}
我没有在JPA 2.1规范中找到类似的限制,因此可能是Hibernate的缺点。
在您的特定情况下,问题是@NamedEntityGraph
引用了Route
类是可嵌入的,因此它在实体图中的使用似乎被Hibernate禁止(不幸的是)。
为了使其工作,您需要稍微更改您的实体模型。我想到了一些例子:
Route
定义为实体Route
并将其towns
字段移至Ride
实体(简化实体模型)将route
字段从Ride
移至Town
实体,将routedTowns
地图的地图添加到Ride
实体:
@Entity
public class Ride implements Serializable {
...
@ManyToMany(mappedBy = "rides")
private Map<Route, Town> routedTowns;
...
}
@Entity
public class Town implements Serializable {
...
@ManyToMany
private List<Ride> rides;
@Embeddable
private Route route;
...
}
当然,实体图可能需要相应的更改。