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

Posted

技术标签:

【中文标题】在没有事务的情况下如何将实体保存到数据库中?【英文标题】:How is the entity being saved to the database without a transaction? 【发布时间】:2019-09-08 05:09:35 【问题描述】:

我可以在我的 Spring Boot 应用程序中保存一个没有 @Transactional 的实体。我之所以注意到这一点,是因为在将 @Transactional 添加到 EmployeeService.java 中的 save 方法之前,我无法更新实体。

我没有在班级级别注释@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);

【问题讨论】:

默认情况下spring.jpa.open-in-view 设置为true。大概是这个原因 @caco3 这就是确切的原因。谢谢你的澄清。您能否提供更多详细信息来说明为什么会这样?这是我第一次遇到 open-in-view,因为我是 Spring 新手。 @caco3 另外,我不知道如何投票或将您的答案标记为正确。 你不能,因为它是评论:) 我已经发布了一些相关链接的答案 【参考方案1】:

默认情况下,在 Spring Boot Web 应用程序中,spring.jpa.open-in-view 设置为 true

大概是这个原因

来自Spring Boot Reference Guide:

如果您正在运行 Web 应用程序,Spring Boot 默认注册 OpenEntityManagerInViewInterceptor 以应用“在视图中打开 EntityManager”模式,以允许在 Web 视图中延迟加载。如果您不希望这种行为,您应该在您的application.properties 中将spring.jpa.open-in-view 设置为false

另见

What is this spring.jpa.open-in-view=true property in Spring Boot? The Open Session In View Anti-Pattern Log a warning on startup when spring.jpa.open-in-view is enabled but user has not explicitly opted in

【讨论】:

以上是关于在没有事务的情况下如何将实体保存到数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

save(),saveOrUpdate(),merge()的区别

save(),saveOrUpdate(),merge()的区别

save(),saveOrUpdate(),merge()的区别

save(),saveOrUpdate(),merge()的区别

Save()saveOrUpdate()Hibernate的merge()方法

如何在没有数据库的情况下将数据保存到数组中