Hibernate / JPA刷新整个集合

时间:2018-03-07 02:38:17

标签: java hibernate jpa jpa-2.0

我有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来通过父代的外键选择记录。这样效率更高。

我能以这种方式刷新整个列表吗?

2 个答案:

答案 0 :(得分:1)

我怀疑是否可以告诉entityManager使用单个语句或单个SQL刷新整个集合。我认为如果JPA提供这样的功能并且通过基于父ID发出单个SQL来说刷新真的很好。

EntitiManager.refresh()方法希望我们传递一个托管实体。所以我们无法传递List&lt;&gt;直接到这个方法。所以我看到的其他两个选项是:

  1. 迭代集合并在每个实体上调用刷新。(就像你一样) OR
  2. 在子集合上使用CascadeType.REFRESH在父对象上调用刷新。虽然这仍然会导致为子集合中的每个实体触发数据库查询。

答案 1 :(得分:1)

如果不使用二级缓存,请使用命名查询与子关系一起获取父实体。与逐个刷新每个成员相比,这将显着提高效率。

很酷的是,命名查询将绕过第一级缓存。

如果您使用二级缓存,则需要首先逐出该实体。