我正在将 Spring JPARepository 与休眠一起使用,并且有一个关于实体更新的问题。我通过传递单个实体来调用 jparepository.save(entity) 但在跟踪日志中我也可以看到为数据库中的其他行发出的更新语句。在调用 save 之前,我有一个 findAll 并且某些实体的值正在发生变化。但我只传递了一个实体进行保存,但所有更新的实体仍然被保存。您能否提供有关此的任何信息。
问问题
1298 次
1 回答
5
当您从数据库加载实体时,这些实体是“托管实体”。如果您更改“托管实体”(并稍后提交事务),则不需要显式保存它们。(这就是“管理”的意思。)
但是 Hibernate 不会立即更新数据库,而是会等到:
- 你提交交易
- 你调用
EntityManager.flush
或 - 您通过 Hibernate 执行一些数据库查询或保存!(当您绕过 Hibernate 并通过普通 JDBC/Spring JDBC 模板执行查询时,您需要先调用
EntityManager.flush
,否则您可能看不到未喷射的数据(https://stackoverflow.com/a/29825882 /280244 ))
这就是你观察到的:
- 1)您加载了一些实体,因此它们成为托管的
- 2)你修改它们,但是hibernate仍然不执行sql更新
- 3)您查询某个实体或保存一个实体,休眠刷新更改
于 2013-07-26T19:02:40.397 回答