刷新存储库

时间:2014-04-24 06:54:04

标签: java jpa

在我看到的大多数代码(Spring)中,似乎没有人从存储库中调用entityManager.flush()。这有什么理由吗?

2 个答案:

答案 0 :(得分:2)

是的,有一个原因。默认情况下,在提交事务之前,或在执行查询结果可能取决于未刷新的修改之前,会自动调用flush()。因此几乎不需要明确的flush()

尽可能晚地刷新是一件好事,因为它可以避免在事务被回滚时执行查询。

答案 1 :(得分:-1)

通常,如果您的JPA代码正确包含在事务中,则会自动执行flush。如果在代码执行期间查看日志,可以看到:

  • 更新或创建操作不会写入数据库,直到:
    • 会话结束(因此交易结束);因此批处理SQL命令
    • a'发现'执行操作(因为它必须在DB设置的连贯数据上完成)
  • SQL命令可以重新排序以提高效率

因此,如果您想要明确' flush'那么,flush命令很有用。

Animal animal = new Animal();
animal.setName(“Pluto”);
entityManager.persist(animal); /* pluto is saved here */

Owner owner = new Owner();
owner.setName(“Mickey”);
animal.setOwner(owner);
entityManager.persist(owner); /* mickey is saved here */

owner.setName(“Minnie”);
entityManager.merge(owner);
animal.setName(“Mickey”);
entityManager.merge(animal);

/* pluto and mickey are updated here, just before the find query */
Query q = entityManager.createQuery(“FROM Animal a”);