Spring Boot JPA 附加分离实体

问题描述 投票:0回答:1

想象一下您有一个常见的场景,您迭代记录列表。您想要在循环内操作每条记录。

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<>();
}

有两种常见的解决方案

  1. 由于性能问题,您使用急切加载在大多数情况下并不是一个好主意
  2. 您使用@Transactional 注释。

要使用@Transactional,您必须将迭代和操作方法拆分为两个类,以使Spring能够创建适当的代理实体,否则两者将在同一个事务中运行,并且您必须在提交事务之前等待完整的循环完成.

当操作()方法位于另一个服务类中时,您必须将 e 对象附加回来。您可以使用 repo.findById(e.getId()) 来做到这一点,但感觉很丑。是否有更优雅的方法来处理这种情况,或者是否有更好的方法来附加分离的实体?

spring spring-boot jpa spring-data-jpa
1个回答
0
投票

当操作()方法位于另一个服务类中时,您必须 将 e 对象附加回来。你可以这样做 repo.findById(e.getId()) 但感觉很难看。

如果迭代循环位于标有

@Transactional
的方法内,则嵌套操作将不会生成分离的对象。

仅当标有

@Transactional
的原始方法结束时,从循环中迭代的对象才会分离。

© www.soinside.com 2019 - 2024. All rights reserved.