什么时候在Spring Data JPA中分离对象?

时间:2018-07-03 14:09:26

标签: jpa spring-data-jpa spring-data

我有一个使用Spring Data Repository检索对象的服务。该服务未标记为事务性的,因此我假定从存储库返回的任何对象都将被分离,因为事务将在存储库范围内。但是,似乎该对象没有分离,这令我感到惊讶。这是一个代码示例:

public class MyService {
  @Autowired
  private MyRepository repo;
  @Autowired
  private EntityManager entityManager;

  /**
   * Updates a persisted entity based on the given DTO representation.
   */
  public MyObjectDto update(MyObjectDto dto) {
    MyObjectJpa existing = repo.findOne(dto.getId());

    entityManager.isJoinedToTransaction(); // returns false so no transaction should be active in this scope I would assume
    entityManager.contains(existing); // this returns true, but I don't know why

    if (existing != null) {
      MyObjectJpa updated = toJpa(dto);

      // calling repo.save(..) modifies the state of 'existing' object which surpised me
      MyObjectDto updatedDto = toDto(repo.save(updated));
      return updatedDto;
    }
    return null;
  }

即使我的服务方法未标记为事务性(即未使用Spring的@Transactional注释),为什么代码示例中的“现有”对象仍由entityManager管理?谢谢。

1 个答案:

答案 0 :(得分:1)

在Spring Boot中,参数spring.jpa.open-in-viewset to true by default

我认为您应该将其转到false

来自java-doc:

  

注册OpenEntityManagerInViewInterceptor。将JPA EntityManager绑定到线程以完成请求的整个处理。