【问题标题】:SpringBoot JPA need no .save() on @Transactional? [duplicate]SpringBoot JPA 在@Transactional 上不需要 .save() 吗? [复制]
【发布时间】:2023-03-06 07:59:01
【问题描述】:

我有一个简短的问题:

我需要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 规范中也有描述。
  • 感谢您的澄清。我完全不知道这种行为!
  • 谢谢你 :) 清除它

标签: java spring spring-boot jpa spring-data-jpa


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,听起来不错。
  • 嗨,如果我使用 findById, setValue(changeSomeValue) 然后执行 save(oldObject) 然后我要删除 (oldObject),但结果我的 save(oldObject) 没有执行,只有 jpa在最后一个动作中执行 delete(oldObject),但如果我评论删除行,代码正在更新,你能帮帮我吗?这是我的问题stackoverflow.com/questions/64331680/…
猜你喜欢
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多