使用Hibernate的SPRING JPA更新所有实体实例,即使使用一个实体调用save也是如此

时间:2013-07-26 17:55:00

标签: spring hibernate jpa entity

我正在使用带有hibernate的Spring JPARepository,并且对实体更新有一个问题。 我通过传递单个实体来调用jparepository.save(实体)但在跟踪日志中我也可以看到为数据库中的其他行发出的更新语句。 在调用save之前,我有一个findAll,并且某些实体的值正在变化。 但我只传递一个实体进行保存,但仍然保存了所有更新的实体。 能否请您提供相关信息。

1 个答案:

答案 0 :(得分:3)

从数据库加载实体时,此实体是“托管实体”。 如果您更改“托管实体”(并稍后提交事务),则无需明确保存它们。 (这就是“管理”的意思。)

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

  • 您提交了交易
  • 您调用EntityManager.flush
  • 执行一些数据库查询或通过Hibernate保存! (当您绕过Hibernate并通过普通JDBC / Spring JDBC模板执行查询时,则需要先调用EntityManager.flush,否则您可能看不到非喷射刷新数据(https://stackoverflow.com/a/29825882/280244) )

这就是你观察到的:

  • 1)您加载了一些实体,因此它们会被管理
  • 2)你修改它们,但是hibernate仍然没有执行sql更新
  • 3)您查询某个实体或保存一个实体,hibernate刷新更改