Hen*_*len 6 java sql performance jpa
我有JPA实体订单与Customer的ManyToOne关系.它是双向的,因此Customer也有一个OneToMany字段订单.这两个关系都使用EAGER获取(或者在OpenJPA fetchplan中).
当我从Order中选择时,我得到1个订单选择,N选择Customer.orders字段.令我惊讶的是,OpenJPA,EclipseLink和Hibernate存在这个问题,即使我使用JOIN FETCH(它在单向情况下也能工作).
有没有好办法解决这个问题?有没有解决更复杂图形的N + 1选择问题的解决方案?
编辑:我自己的研究结果: - 对于OpenJPA(我正在使用)我还不知道解决方案 - 对于Hibernate @Fetch(FetchMode.SUBSELECT)解决了这个问题.使用@BatchSize也有帮助,它同时选择给定数量的customer.orders字段. - 对于EclipseLink,我发现了类似的功能@BatchFetch(value = BatchFetchType.IN),但在这种情况下没有帮助,我想它无法在双向关系中有效地处理这个问题.
om3*_*39a -1
在任何 ORM 框架中,N+1 问题都很常见。你无法避免这一点。但是,这更多的是关于你采取什么样的方法来解决问题。您可以根据您的实现使用关联和延迟加载或预先加载日期。您还可以执行数据库映射并在单个查询中获取所有关联数据,然后将其映射到您的模型。由于数据库已建立索引,因此此操作比使用 N+1 查询获取数据和映射更快(如果您的网络延迟允许)。
| 归档时间: |
|
| 查看次数: |
14478 次 |
| 最近记录: |