Hibernate flush()和Cascade.PERSIST

时间:2012-01-29 11:46:22

标签: hibernate cascade flush object-state

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

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

我正在研究一个示例图书馆管理系统。 作者图书之间的关系是 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. 将作者添加到 authors 在Book实例中设置。
  5. 开始交易
  6. 更新图书实例
  7. 提交交易。
  8. 与我的预期相反,我注意到更新本书已经 NOT 传播并保留了瞬态Author实例。作者实例仍然是暂时的。

    现在,如果我将 FlushMode设置为AUTO(默认值),不仅会提交瞬态作者,还会在BookAuthor表中创建关系。

    我很惊讶知道flush()扮演着如此重要的角色。

    我做错了吗?

    此致

    Shardul。

1 个答案:

答案 0 :(得分:0)

flush是将更改写入数据库的方法。没有冲洗,没有写任何东西。很明显,如果将flush模式设置为manual并且从不调用flush,则不会将任何内容写入数据库。