Hibernate 如何在没有事务的情况下将实体保存到数据库中?

Hibernate 如何在没有事务的情况下将实体保存到数据库中?,hibernate,spring-boot,transactional,Hibernate,Spring Boot,Transactional,我可以在Spring Boot应用程序中保存实体,而无需@Transactional。我之所以注意到这一点,是因为在EmployeeService.java中的save方法中添加了@Transactional之后,我才能够更新实体 我没有在类级别上注释@Transactional。在我的服务层中找到的唯一其他位置是不属于save方法的方法。我的EmployeeDAO未扩展JPARepository。它用@Repository注释。我有springbootstarter数据jpa作为依赖项。我也不

我可以在Spring Boot应用程序中保存实体,而无需
@Transactional
。我之所以注意到这一点,是因为在
EmployeeService.java
中的
save
方法中添加了
@Transactional
之后,我才能够更新实体

我没有在类级别上注释
@Transactional
。在我的服务层中找到的唯一其他位置是不属于
save
方法的方法。我的
EmployeeDAO
未扩展
JPARepository
。它用
@Repository
注释。我有
springbootstarter数据jpa
作为依赖项。我也不是手动开始或提交事务

EmployeeRestController.java

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

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

    currentSession.saveOrUpdate(employee);
}
EmployeeService.java

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

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

    currentSession.saveOrUpdate(employee);
}
EmployeeDAO.java

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

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

    currentSession.saveOrUpdate(employee);
}

默认情况下,Spring引导Web应用程序中的
Spring.jpa.open in view
设置为
true

很可能就是这个原因

发件人:

如果您正在运行一个web应用程序,Spring Boot默认注册
OpenEntityManagerViewInterceptor
以应用“视图中的OpenEntityManager”模式,以允许在web视图中延迟加载。如果不希望出现这种行为,则应在
应用程序.properties中将
spring.jpa.openin view
设置为
false

另见


默认情况下,
spring.jpa.open in view
设置为
true
。可能是因为reason@caco3这就是确切的原因。谢谢你的澄清。你能提供更多的细节说明为什么会出现这种情况吗?这是我第一次遇到open in view,因为我是Spring新手。@caco3另外,我不知道如何投票或将你的答案标记为正确。你不能,因为这是一条评论:)我已经发布了一个带有一些相关链接的答案