没有事务如何将实体保存到数据库?

时间:2019-04-17 21:32:04

标签: hibernate spring-boot transactional

我能够在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);
}

1 个答案:

答案 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

另请参见