我能够在Spring Boot应用程序中保存没有@Transactional
的实体。我只是注意到了这一点,因为直到在@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);
}
答案 0 :(得分:0)
在Spring Boot Web应用程序中,默认情况下,spring.jpa.open-in-view
设置为true
。
很可能是原因
来自Spring Boot Reference Guide:
如果您正在运行Web应用程序,则默认情况下,Spring Boot注册
OpenEntityManagerInViewInterceptor
以应用“在视图中打开EntityManager”模式,以允许在Web视图中进行延迟加载。如果您不希望出现这种情况,则应在spring.jpa.open-in-view
中将false
设置为application.properties
。
另请参见: