【发布时间】:2018-03-07 02:38:17
【问题描述】:
我有一个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 时,休眠是如何工作的,它只是触发一个 SQL 来通过父外键选择记录。这样更有效率。
我可以这样刷新整个列表吗?
【问题讨论】:
-
能否解释一下为什么需要刷新实体?为什么不刷新父实体,或者完全取消交易?您所指的长操作是否包含在事务中?
-
@crizzis 刷新父实体会刷新子实体吗?我检查了级联类型,没有这样的选项。是的,长操作意味着它被包装在一个事务中。
-
ALL = DETACH, MERGE, PERSIST, REFRESH, REMOVE -
@crizzis 我明白了.. 这是我的错误...我从这里忽略了它docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/…
-
@crizzis 所以通过刷新父级,休眠应该立即刷新集合对吗?而不是一一刷新子实体。
标签: java hibernate jpa jpa-2.0