我从那时起就一直在研究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 。
这就是我在做的事。
与我的预期相反,我注意到更新本书已经 NOT 传播并保留了瞬态Author实例。作者实例仍然是暂时的。
现在,如果我将 FlushMode设置为AUTO(默认值),不仅会提交瞬态作者,还会在BookAuthor表中创建关系。
我很惊讶知道flush()扮演着如此重要的角色。
我做错了吗?
此致
Shardul。
答案 0 :(得分:0)
flush
是将更改写入数据库的方法。没有冲洗,没有写任何东西。很明显,如果将flush模式设置为manual并且从不调用flush,则不会将任何内容写入数据库。