Hibernate:我是否需要flush()?

Kon*_*rus 7 java hibernate transactions

我有一个双向的一对多关系.我试图像在这个文档中坚持它:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/example-parentchild.html#example-parentchild-bidir

Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
c.setParent(p);
p.getChildren().add(c);
session.save(c);
session.flush();
Run Code Online (Sandbox Code Playgroud)

那是flush()必需的吗?它到底是做什么用的?我知道它做了什么,但我发现它花了我100毫秒,如果可能的话我真的想避免它.

什么时候session.load()甚至session.refresh()被调用而且我没有脸红,它会包含新Child的收藏品吗?

Ale*_*nes 12

对flush的调用将使会话状态与数据库同步.此时您无需显式刷新.Hibernate非常聪明,可以知道何时需要使用会话更新数据库,例如在执行查询之前.

由于在应用程序中使用数据库是不可避免的后果,因此必须在某一时刻产生100毫秒的成本.Hibernate能够延迟此操作并批量处理数据库更改,以最大限度地减少到数据库的往返.

Hibernate将在事务结束时(默认情况下)刷新会话,因此如果在同一会话中调用load,您将从会话中获取相同的对象.如果你在一个新的会话中调用load,Hibernate将刷新更改,你的孩子将在该集合中.

如果您要在执行同花顺之前清除会话或从会话中逐出您的对象,您会发现您的孩子不在场.

从文档章节应该帮助.


Bas*_*Roy 5

如果您想要保证其他会话能够看到您更改的数据,则需要刷新.

调用session.load()甚至session.refresh()并且我没有刷新时,它是否会在集合中包含新的Child?

如果您在同一会话中并且调用session.refresh,则手动更改将丢失.如果您在不同的会话中并且调用session.refresh,它们将不包括您的手动更改.