当前位置: 首页 > 知识库问答 >
问题:

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

慕容铭
2023-03-14

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

public interface ExampleObjectRepository extends CrudRepository<ExampleObject, Long> {

}

通过扩展JParePository接口,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)方法一起使用时,更改实体的状态可能也会更改其定义,因此我还希望了解如何处理更新的标识。

共有1个答案

蒋何平
2023-03-14

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

如果您不希望您的更改是持久的,那么就不要进行更改,或者回滚事务。

在分离的实体上工作将是一场噩梦,因为这样可以防止延迟加载所有关联。您总是可以对您的实体调用EntityManager.detach(),但我真的不会这么做。只是试着去理解它是如何工作的,然后去处理它。好处比坏处多得多。其中之一是,您甚至不需要考虑保存复杂业务逻辑可能进行的所有更改,因为这些更改都是由JPA透明地为您完成的。

 类似资料:
  • 问题内容: 我有一个简单的Java类,如下所示: 这段代码的输出是这样的: 为什么s不在finally块中覆盖,而是控制打印输出? 问题答案: 在与所述的执行块完成语句和的值在时间语句执行是由该方法返回的值。finally子句稍后s(在语句完成之后)更改值的事实(此时)并未更改返回值。 请注意,以上内容处理的s是对块中自身值的更改,而不是对s引用对象的更改。如果s是对可变对象的引用(String不

  • 问题内容: 我试图了解为什么以下测试代码无法按预期工作: 这将打印: 意思是显然被修改了……然后就没有了。 有人知道这可能是什么问题吗? 问题答案: AddString方法正在使用值(副本)接收器。修改是针对副本,而不是原始文档。必须使用指针接收器来改变原始实体: 操场 输出量

  • 问题内容: 为什么更改总和顺序会返回不同的结果? = = 双方的Java和JavaScript的返回相同的结果。 我知道,由于以二进制表示浮点数的方式,某些有理数( 例如1/3-0.333333 … )无法精确表示。 为什么简单地更改元素的顺序会影响结果? 问题答案: 也许这个问题很愚蠢,但是为什么仅仅改变元素的顺序会影响结果呢? 它将根据值的大小更改四舍五入的点。作为示例 _样的_事情,我们所看

  • 问题内容: 我正在尝试更改持久对象的ID。我在Hibernate和MySQL中使用JPA。我执行代码时遇到的错误是:org.hibernate.HibernateException:com.tutorial.jpa.certification.listing5_18.AA实例的标识符从2更改为99 我找不到此问题的答案,因此在此感谢您的帮助。代码为: 问题答案: 您永远不要修改实体的主键 -这定义

  • 问题内容: 在构建应用程序时会创建persistence.xml中的持久性单元。由于我想在运行时更改数据库URL,是否有任何方法可以在运行时修改持久性单元?我应该使用其他数据库,而不是在分发后预先绑定一个数据库。 我正在使用EclipseLink(JPA 2.1) 问题答案: 保持持久性单元文件(Persistence.xml)不变。您可以按如下所示覆盖其中的属性。

  • 我是Java和创建API的新手。我试图简单地发出一个后请求,并得到一个具体的值。以下是我的代码: ProjectResponse类简单地包含: 问题是,id aøwaus 被返回为 (id=空)。即使当我使用“字符串”而不是项目响应时,一切正常,我看到ID已创建。因此,由于某种原因,将响应映射到项目响应类存在问题。 有人知道可能出了什么问题吗?