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
方法调用,则从那时起,持久性提供程序已管理。
现在,如果您对该实体(实际上是一个代理对象)进行任何更改,在事务提交时,这些更改将被持久化到数据库中,而不管调用save
或update
方法。
当您从头开始创建新实体且持久性提供程序尚不知道其存在时,必须使用save
或persist
。
请记住,如果您在更改发生之前对该特定实体使用 detach
或 evict
方法,则可以防止在提交时进行任何更改。
【讨论】:
谢谢,听起来不错。 嗨,如果我使用 findById, setValue(changeSomeValue) 然后执行 save(oldObject) 然后我要删除 (oldObject),但结果我的 save(oldObject) 没有执行,只有 jpa在最后一个动作中执行 delete(oldObject),但如果我评论删除行,代码正在更新,你能帮帮我吗?这是我的问题***.com/questions/64331680/…以上是关于SpringBoot JPA 在@Transactional 上不需要 .save() 吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章