java 命名实体图子子图
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/38505745/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Named Entity Graph Sub-Subgraph
提问by sashok_bg
I am new to JPA 2.1 and started using only recently Named Entity Graphs. For my project I am mapping the following relation in JPA 2.1:
我是 JPA 2.1 的新手,开始只使用最近的命名实体图。对于我的项目,我在 JPA 2.1 中映射了以下关系:
Order -> OrderDetail -> Product -> ProductLine
订单 -> 订单详情 -> 产品 -> 产品线
The question:
问题:
I want to instruct JPA to join and fetch properly all the needed data. So far this works flawlessly for Order -> OrderDetail -> Productbut I have not managed so far to add a Sub-Sub Graph in order to go as deep as the ProductLine class. How do I make a subgraph of a subgraph ? Ex get the ProductLine of the Product ?
我想指示 JPA 加入并正确获取所有需要的数据。到目前为止,这对于Order -> OrderDetail -> Product 来说完美无缺,但到目前为止我还没有设法添加一个 Sub-Sub Graph 以便像 ProductLine 类一样深入。如何制作子图的子图?例如获取产品的产品线?
Here are my entities (getters and setters omitted):
这是我的实体(省略了 getter 和 setter):
Order
命令
@Entity
@Table(name="ORDERS")
@NamedEntityGraph(
name = "graph.Order.details",
attributeNodes = {
@NamedAttributeNode(value = "details", subgraph = "graph.OrderDetail.product")
},
subgraphs = {
@NamedSubgraph(name = "graph.OrderDetail.product", attributeNodes = @NamedAttributeNode("product"))
}
)
public class Order implements Serializable{
@Id
@Column(name = "orderNumber")
private Long number;
@Column(name = "orderDate")
private Date date;
@OneToMany(mappedBy = "order")
private List<OrderDetail> details;
}
OrderDetail
订单详情
@Entity
@Table(name = "orderdetails")
public class OrderDetail implements Serializable{
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "orderNumber")
@Id
private Order order;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "productCode", nullable = false)
@Id
private Product product;
@Column(name = "orderLineNumber")
private int lineNumber;
@Column(name = "quantityOrdered")
private int quantity;
Product
产品
@Entity
@Table(name = "products")
class Product {
@Column(name = "productCode")
@Id
private String code;
@Column(name = "quantityInStock")
public int quantity;
@ManyToOne
@JoinColumn(name = "productLine")
private ProductLine line;
ProductLine
生产线
@Entity
@Table(name = "productlines")
public class ProductLine {
@Id
@Column(name = "productLine")
private String line;
@Column
private String textDescription;
采纳答案by Daniel Wisehart
The simple answer is that you cannot do this because, with the current JPA implementation, you would end up doing two separate queries and having to deal with the Cartesian Products. Some future version of JPA could be extended to include more levels of subgraphs, but as it stands today it does not. There is a JPA SPEC group that works on the next version of JPA. Feel free to submit your request/suggestion there.
简单的答案是您不能这样做,因为使用当前的 JPA 实现,您最终将执行两个单独的查询并且必须处理笛卡尔积。某些未来版本的 JPA 可以扩展以包含更多级别的子图,但就目前而言,它没有。有一个 JPA SPEC 组负责 JPA 的下一个版本。 随时在那里提交您的请求/建议。
Here on StockOverflow there is another reference to the same question.
在 StockOverflow 上,还有对同一问题的另一个参考。
回答by Vaneet Kataria
You can create multi level entity graphs with dynamic entity graphs. I am using jpa 2.2 and Hibernate 5.3.7 and i am able to create entity graphs and fetch data upto 3 levels . I hope this will work for next level too . Below is the code snippet . For more details and actual code you can checkout my github repo : https://github.com/vaneetkataria/Jpa-Hibernate/blob/master/jdbcToJpaMigration/src/test/java/com/katariasoft/technologies/jpaHibernate/entity/fetch/entitygraph/dynamic/MultiInstructorsDynamicEntityGrpahTests.java
您可以使用动态实体图创建多级实体图。我正在使用 jpa 2.2 和 Hibernate 5.3.7,我能够创建实体图并获取最多 3 个级别的数据。我希望这也适用于下一个级别。下面是代码片段。有关更多详细信息和实际代码,您可以查看我的 github 存储库:https: //github.com/vaneetkataria/Jpa-Hibernate/blob/master/jdbcToJpaMigration/src/test/java/com/katariasoft/technologies/jpaHibernate/entity/fetch /entitygraph/dynamic/MultiInstructorsDynamicEntityGrpahTests.java
Code snippet :
代码片段:
@SuppressWarnings("unchecked")
@Test
@Rollback(false)
public void fetchInstrctrsIdProofVehiclesStudentsTheirInstructorsVehiclesAndTheirDocuments() {
doInTransaction(() -> {
EntityGraph<Instructor> instructorGraph = em.createEntityGraph(Instructor.class);
instructorGraph.addAttributeNodes(Instructor_.idProof, Instructor_.vehicles);
Subgraph<Student> studentSubgraph = instructorGraph.addSubgraph(Instructor_.STUDENTS);
studentSubgraph.addAttributeNodes(Student_.instructors);
Subgraph<Vehicle> vehicleSubgraph = studentSubgraph.addSubgraph(Student_.VEHICLES);
vehicleSubgraph.addAttributeNodes(Vehicle_.documents);
TypedQuery<Instructor> query = em.createQuery("select i from Instructor i ", Instructor.class)
.setHint(EntityGraphUtils.FETCH_GRAPH, instructorGraph);
List<Instructor> instructors = query.getResultList();
if (Objects.nonNull(instructors))
instructors.forEach(instructor -> {
IdProof idProof = instructor.getIdProof();
Set<Vehicle> vehicles = instructor.getVehicles();
Set<Student> students = instructor.getStudents();
System.out.println(instructor);
System.out.println(idProof);
if (Objects.nonNull(vehicles))
vehicles.forEach(v -> System.out.println(v.getVehicleNumber()));
if (Objects.nonNull(students))
students.forEach(s -> System.out.println(s.getName()));
});
});
}