【问题标题】: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 另外,我不知道如何投票或将您的答案标记为正确。
  • 你不能,因为它是评论:) 我已经发布了一些相关链接的答案

标签: hibernate spring-boot transactional


【解决方案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

另见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2015-02-17
    • 2011-08-31
    • 1970-01-01
    相关资源
    最近更新 更多