我有一系列 JPA 持久化和 setter 调用(更新),这些调用应该在下一行代码执行之前发生,但记录器显示持久化产生的 hibernate 查询晚于下一行发生代码。
代码
myDAO.persist(object1); //insert 1
myOtherDAO.persist(object2); //insert 2
object3.setProperty("value"); //update 1
System.out.println ("*****Message 1");
doWork();
System.out.println("*****Message 2");
记录器显示的内容
Hibernate: insert into tableName1... //insert 1
Hibernate: insert into tableName2... //insert 2
*****Message 1
ERROR BECAUSE UPDATE DIDNT HAPPEN
*****Message 2
Hibernate: update table3 ... //update 1 (too late)
因此,插入 1、插入 2 和更新 1 并不是全部发生在下一行代码之前,而是更新 1 实际上发生得太晚了。有人能告诉我为什么这件事发生在我身上以及我做了什么才应得的吗?
编辑
我应该提到,这是在集成测试方法中,并且 doWork() 实际上是发送到 servlet 的模拟请求。 servlet 是问题发生的地方,因为它在数据库中找不到预期的状态。 Servlet 是否在事务之外并有效地“绕过 Hibernate 的后面”?我应该在将请求发送到 servlet 之前刷新吗?
最佳答案
这是正常且预期的行为。如果 Hibernate 在每次修改持久属性时都执行更新查询,那么性能将是灾难性的。所有修改实体的状态在刷新时都保留在数据库中。冲洗发生
- 提交时
- 当您显式调用
session.flush()
或entityManager.flush()
时 - 当您执行查询(HQL 或 Criteria)来查询已修改实体的表之一时
因此,除非您使用 JDBC 或某些 native 查询在 Hibernate“后面”执行查询,否则您不应该出现任何错误。如果是这样,请在执行此查询之前显式刷新。
关于hibernate - 当我使用 JPA persist 时,为什么我的 hibernate 查询发生的时间晚于预期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9744489/