Когда объект отсоединяется в Spring Data JPA? - PullRequest
0 голосов
/ 03 июля 2018

У меня есть служба, которая использует хранилище данных Spring для извлечения объекта. Служба НЕ помечена как транзакционная, поэтому я предположил, что любой объект, возвращаемый из хранилища, будет отсоединен, поскольку транзакция будет ограничена хранилищем. Однако, кажется, что объект НЕ отделен, что удивляет меня. Вот пример кода:

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

Почему «существующий» объект в моем примере кода все еще управляется entityManager, даже если мой метод обслуживания не помечен как транзакционный (т.е. не использует аннотацию @Transactional из Spring)? Спасибо.

1 Ответ

0 голосов
/ 03 июля 2018

В Spring Boot параметр spring.jpa.open-in-view равен и установлен на true по умолчанию .

Я думаю, тебе стоит включить false.

Из Java-документа:

Регистрация OpenEntityManagerInViewInterceptor. Привязывает JPA EntityManager к потоку для всей обработки запроса.

...