我有以下实体结构:
Route: -one-to-many-> :Stop: <-many-to-many-> :Child: <-many-to-many-> :Contact
所以我在每个实体类的顶部定义了以下命名实体图,这样我就可以优化我的查询,以了解我需要在这个层次结构中走多远:
路线:
@NamedEntityGraphs({
@NamedEntityGraph(name = "Route.stop.child.contact",
attributeNodes = {
@NamedAttributeNode(value = "stops", subgraph = "Stop.child.contact")
}),
@NamedEntityGraph(name = "Route.stop.child",
attributeNodes = {
@NamedAttributeNode(value = "stops", subgraph = "Stop.child")
}),
@NamedEntityGraph(name = "Route.stop",
attributeNodes = {
@NamedAttributeNode(value = "stops", subgraph = "Stop")
})
})
public class Route {...}
停止:
@NamedEntityGraphs({
@NamedEntityGraph(name = "Stop.child.contact",
attributeNodes = {
@NamedAttributeNode(value = "children", subgraph = "Child.contact")
}),
@NamedEntityGraph(name = "Stop.child",
attributeNodes = {
@NamedAttributeNode(value = "children", subgraph = "Child")
}),
@NamedEntityGraph(name = "Stop", attributeNodes = {})
})
public class Stop {...}
孩子:
@NamedEntityGraphs({
@NamedEntityGraph(name = "Child.contact",
attributeNodes = {
@NamedAttributeNode(value = "contacts", subgraph = "Contact")
}),
@NamedEntityGraph(name = "Child", attributeNodes = {})
})
public class Child {...}
接触:
@NamedEntityGraphs({@NamedEntityGraph(name = "Contact", attributeNodes = {})})
public class Contact {...}
我在我的 Repository 类中使用它们:
@EntityGraph(value = "Route.stop.child.contact", type = EntityGraph.EntityGraphType.LOAD)
Optional<Route> findRouteStopsChildrenContactsByRouteId(short routeId);
但是,我看不到正在执行任何连接查询,并且当我尝试访问停靠点的子节点时会抛出一个lazyinit 异常。我的理解是,这就是如何使用实体图来优化查询(即,当我必须为每个单独的站点获取子节点时出现 n+1 问题),但我没有运气让它工作。
关于我做错了什么的任何建议?