SpringBoot JPA 在@Transactional 上不需要 .save() 吗? [复制]

Posted

技术标签:

【中文标题】SpringBoot JPA 在@Transactional 上不需要 .save() 吗? [复制]【英文标题】:SpringBoot JPA need no .save() on @Transactional? [duplicate] 【发布时间】:2018-03-24 07:12:09 【问题描述】:

我有一个简短的问题:

我需要repo.save(x) 调用@Transactional 方法吗?

我问是因为我在没有保存的情况下看到我的数据库上的更改,并且没有阅读关于它的明确文档。

那么它是按预期工作,还是只是(受欢迎的)意外行为?

示例:

@Autowired
private UserRepo repo;

@Transactional  
@PutMapping
public Long put(@RequestBody User user)

  User u = repo.findOne(user.getId());
  u.setName("Paul");
  repo.save(u); // DO I NEED THIS LINE?

我只是不确定,所以也许有人可以对这个主题有所了解?

【问题讨论】:

是的,这在托管 (JEE / JTA) 环境中是正常的。每个附加的对象都被保存 @YannicKlem 持久化实体在事务刷新时由 Hibernate 保存,因此不需要手动 save()。这在11.5 Modifying persistent objects 中有描述。不知道这是仅在 Hibernate 中的一个特性,还是在 JPA 规范中也有描述。 感谢您的澄清。我完全不知道这种行为! 谢谢你 :) 清除它 【参考方案1】:

如果您检索一个实体,例如在事务方法中使用findOne 方法调用,则从那时起,持久性提供程序已管理

现在,如果您对该实体(实际上是一个代理对象)进行任何更改,在事务提交时,这些更改将被持久化到数据库中,而不管调用saveupdate 方法。

当您从头开始创建新实体且持久性提供程序尚不知道其存在时,必须使用savepersist

请记住,如果您在更改发生之前对该特定实体使用 detachevict 方法,则可以防止在提交时进行任何更改。

【讨论】:

谢谢,听起来不错。 嗨,如果我使用 findById, setValue(changeSomeValue) 然后执行 save(oldObject) 然后我要删除 (oldObject),但结果我的 save(oldObject) 没有执行,只有 jpa在最后一个动作中执行 delete(oldObject),但如果我评论删除行,代码正在更新,你能帮帮我吗?这是我的问题***.com/questions/64331680/…

以上是关于SpringBoot JPA 在@Transactional 上不需要 .save() 吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在运行时更新 Springboot 属性 Hibernate/JPA

SpringBoot系列:四SpringBoot集成JPA

springboot jpa 分页查询(增删改查)总结

3.springBoot+jpa

springboot jpa自定义查询

SpringBoot与JPA