同步在hibernate中意味着什么

时间:2010-04-04 08:45:52

标签: java hibernate orm

我在session.flush()

上读到了

在 调用session.flush()时,数据将被同步(但未提交)

什么与什么同步.. 是否是通过查询或来到内存的DB状态 内存状态将被复制到Db?

澄清这个问题..

3 个答案:

答案 0 :(得分:1)

"Flushing is the process of synchronizing the underlying persistent
store with persistable state held in memory."

默认情况下,刷新模式设置为AUTO,在这种情况下,会话在查询执行之前刷新,以确保查询永远不会返回失效状态。

答案 1 :(得分:1)

调用session.flush()将导致在sessios事务范围内为您所做的所有更改以及要在数据库上执行的SQL语句生成SQL语句。

Car car = (Car) session.get(Car.class, 1);
car.setModel("Mustang");
session.flush();

最后一行将在数据库上生成UPDATE语句。但是,根据您在应用程序中处理事务的方式,在提交该部分持有的事务之前,其他用户可能无法看到此更改。

虽然刷新实际上不是双向操作,但它可用于确保将自动生成的标识符分配给新的实体对象。如果Car类映射到具有自动递增标识符的数据库表,则可以使用flush来确保此标识符在应用程序代码中的域对象上可用:

Car car = new Car();
car.setModel("Torino");
session.save(car);

System.out.println(car.getId());               // prints 0
session.flush();
System.out.println(car.getId());               // prints something larger than 0

假设您要发送一封电子邮件,其中包含指向新创建的汽车的链接(确定,用户帐户更有意义),但如果无法发送邮件,您希望回滚您的交易。刷新会话允许您执行此操作。

答案 2 :(得分:1)

Flushing将底层持久存储与内存中保持的持久状态同步,但反之亦然。换句话说,在运行事务中“将内存状态复制到数据库”,以重用您的单词。请注意,刷新并不意味着无法回滚数据。