0

我一直在研究 Hibernate,直到昨天我才真正关注 flush() 方法。

我知道在提交事务时会自动调用 flush() 。

我正在开发一个示例图书馆管理系统。AuthorsBooks之间的关系是ManyToMany

在 Author.java 中

@Fetch(FetchMode.SELECT)
@ManyToMany(mappedBy="authors", cascade={CascadeType.PERSIST, CascadeType.MERGE})
private Set<Book> books = new HashSet<Book>();

在 Book.java 中

@ManyToMany
@Cascade({org.hibernate.annotations.CascadeType.PERSIST})
@JoinTable(
       name="BookAuthor",
       joinColumns={@JoinColumn(name="bookId", referencedColumnName="id")},
       inverseJoinColumns={@JoinColumn(name="authorId", referencedColumnName="id")}
      )
private Set<Author> authors = new HashSet<Author>();

数据库中有一个映射表BookAuthor

这就是我正在做的事情。

  1. 将 FlushMode 设置为 MANUAL
  2. 从数据库中获取一本书
  3. 创建一个新作者。(短暂的)
  4. 将作者添加到 Book 实例中的作者集。
  5. 开始交易
  6. 更新图书实例
  7. 提交事务。

与我的预期相反,我注意到更新 Book 并没有传播和持久化瞬态 Author 实例。Author 实例仍然是瞬态的。

现在,如果我将FlushMode 设置为 AUTO(default),不仅会提交临时作者,还会在 BookAuthor 表中创建一个关系。

令我惊讶的是,flush() 可以发挥如此重要的作用。

难道我做错了什么?

问候,

沙杜尔。

4

1 回答 1

0

flush是将更改写入数据库的方法。没有刷新,什么都不会写。所以很明显,如果您将刷新模式设置为手动并且从不调用刷新,则不会将任何内容写入数据库。

于 2012-01-29T12:17:03.403 回答