Как объект сохраняется в базе данных без транзакции? - PullRequest
2 голосов
/ 18 апреля 2019

Я могу сохранить объект без @Transactional в моем приложении Spring Boot.Я заметил это только потому, что не смог обновить сущность, пока не добавил @Transactional в метод save в EmployeeService.java.

. У меня нет @Transactional, аннотированных на уровне класса,Единственное другое место, где он находится, - это методы в слое моей службы, которые не относятся к методу save.Мой EmployeeDAO не распространяется JPARepository.Он помечен @Repository.У меня spring-boot-starter-data-jpa как зависимость.Я не начинаю и не совершаю транзакцию вручную.

EmployeeRestController.java

@PostMapping("/employees")
public void addEmployee(@RequestBody Employee employee) {
    employee.setId(0);

    employeeService.save(employee);
}

EmployeeService.java

public void save(Employee employee) {
    emplDAO.save(employee);
}

EmployeeDAO.java

@Override
public void save(Employee employee) {
    Session currentSession = em.unwrap(Session.class);

    currentSession.saveOrUpdate(employee);
}

1 Ответ

0 голосов
/ 18 апреля 2019

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

Скорее всего, это причина

С Справочное руководство по загрузке пружин :

Если вы запускаете веб-приложение, Spring Boot по умолчанию регистрирует OpenEntityManagerInViewInterceptor, чтобы применить шаблон «Открыть EntityManager in View», чтобы обеспечить ленивую загрузку в веб-представлениях. Если вы не хотите, чтобы такое поведение, вы должны установить spring.jpa.open-in-view на false в вашем application.properties.

См. Также :

...