gpt4 book ai didi

Spring Data JPA - 为什么对返回的实体的更改会自动持久化?

转载 作者:IT老高 更新时间:2023-10-28 13:48:09 26 4
gpt4 key购买 nike

我用一个例子来提出这个问题。

断言我们有一个如下所示的存储库:

public interface ExampleObjectRepository extends CrudRepository<ExampleObject, Long> {

}

通过扩展JpaRepository接口(interface),ExampleObject存储库继承如下方法:

T findOne(ID id);

现在,我观察到,如果在调用此方法后收到对 ExampleObject 的引用,我对该方法所做的任何操作都会自动保存到数据库中,例如:

ExampleObject pointInCase = exampleObjectRepository.findOne(1L);
pointInCase.setName("Something else");

围绕主题阅读,我理解这意味着 ExampleObject 实例是 not detached

这出乎我的意料。我原以为我需要使用从 CrudRepository 继承的 save 方法来保存更改:

T save(T entity);

是否有人愿意确认从 Spring Data JPA 存储库返回的对象仍然作为标准附加,并解释如何使用 API 标记存储库中的方法,使其仅返回分离的引用?

我想改变实体的状态也可能改变它的定义,当它与上述 save(T entity) 方法一起使用时,所以我也希望了解如何处理更新的身份。

最佳答案

这是 JPA 的基本原则。您使用附加(托管)实体,并且对这些托管实体所做的每次修改都会自动持久化。

如果您不希望您的更改持久化,请不要进行更改或回滚事务。

处理分离的实体将是一场噩梦,因为它会阻止延迟加载所有关联。你总是可以在你的实体上调用 EntityManager.detach() ,但我真的不会那样做。试着了解它是如何工作的并处理它。好处多于坏处。其中之一是您甚至不必考虑保存复杂业务逻辑可能执行的所有更改,因为这一切都由 JPA 透明地为您完成。

关于Spring Data JPA - 为什么对返回的实体的更改会自动持久化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13588565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com