一尘不染

使用Hibernate SPRING JPA更新所有实体实例,即使使用一个实体调用保存

hibernate

我将SpringJPARepository与hibernate一起使用,并且对实体更新有一个问题。我通过传递单个实体来调用jparepository.save(entity),但在跟踪日志中,我也可以看到针对数据库中其他行发出的更新语句。在调用save之前,我有一个findAll并且某些实体的值正在更改。但是我只传递了一个要保存的实体,但是仍然保存了所有更新的实体。您能提供有关此信息吗?


阅读 277

收藏
2020-06-20

共1个答案

一尘不染

从数据库加载实体时,该实体就是“托管实体”。如果更改“托管实体”(并在以后提交事务),则无需显式保存它们。(这是“托管”的意思。)

但是Hibernate不会立即更新数据库,而是将等待直到:

  • 您提交交易
  • 您调用EntityManager.flush
  • 您执行一些数据库查询或通过Hibernate保存!(当您绕过Hibernate并例如通过纯JDBC / Spring JDBC模板执行查询时,您需要先调用EntityManager.flush,否则,您可能看不到未喷射刷新的数据

这就是您观察到的:

  • 1)您加载了一些实体,因此它们成为托管对象
  • 2)您修改它们,但hibernate仍然不执行sql更新
  • 3)您查询某个实体或保存一个实体,hibernate刷新更改
2020-06-20