我有Lazy load
@OneToMany
@JsonIgnore
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private List<OrderItem> orderItems = new ArrayList<>();
经过长时间的操作后,我想刷新orderItems
个实体。
我必须循环遍历孩子并刷新如下:
for (OrderItem orderItem : order.getOrderItems()) {
entityManager.refresh(orderItem);
}
我认为这非常没有效率,因为它试图逐个刷新实体,这意味着它会逐个激发SQL。
我相信当我们调用代理包装器getOrderItems
时hibernate是如何工作的,它只是激活一个SQL来通过父代的外键选择记录。这样效率更高。
我能以这种方式刷新整个列表吗?
答案 0 :(得分:1)
我怀疑是否可以告诉entityManager使用单个语句或单个SQL刷新整个集合。我认为如果JPA提供这样的功能并且通过基于父ID发出单个SQL来说刷新真的很好。
EntitiManager.refresh()方法希望我们传递一个托管实体。所以我们无法传递List&lt;&gt;直接到这个方法。所以我看到的其他两个选项是:
答案 1 :(得分:1)
如果不使用二级缓存,请使用命名查询与子关系一起获取父实体。与逐个刷新每个成员相比,这将显着提高效率。
很酷的是,命名查询将绕过第一级缓存。
如果您使用二级缓存,则需要首先逐出该实体。