在没有事务的情况下如何将实体保存到数据库中?
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 thisspring.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()的区别