想象一下您有一个常见的场景,您迭代记录列表。您想要在循环内操作每条记录。
for (final var e : repository.findAll()) {
manipulate(e)
}
记录包含延迟加载的映射实体。
public class Record {
@Id
private Long id;
@OneToMany(mappedBy = "record", cascade = CascadeType.ALL)
private Set<SubRecord> set = new HashSet<>();
}
有两种常见的解决方案
要使用@Transactional,您必须将迭代和操作方法拆分为两个类,以使Spring能够创建适当的代理实体,否则两者将在同一个事务中运行,并且您必须在提交事务之前等待完整的循环完成.
当操作()方法位于另一个服务类中时,您必须将 e 对象附加回来。您可以使用 repo.findById(e.getId()) 来做到这一点,但感觉很丑。是否有更优雅的方法来处理这种情况,或者是否有更好的方法来附加分离的实体?
当操作()方法位于另一个服务类中时,您必须 将 e 对象附加回来。你可以这样做 repo.findById(e.getId()) 但感觉很难看。
如果迭代循环位于标有
@Transactional
的方法内,则嵌套操作将不会生成分离的对象。
仅当标有
@Transactional
的原始方法结束时,从循环中迭代的对象才会分离。