我一直在研究 Hibernate,直到昨天我才真正关注 flush() 方法。
我知道在提交事务时会自动调用 flush() 。
我正在开发一个示例图书馆管理系统。Authors和Books之间的关系是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。
这就是我正在做的事情。
- 将 FlushMode 设置为 MANUAL
- 从数据库中获取一本书
- 创建一个新作者。(短暂的)
- 将作者添加到 Book 实例中的作者集。
- 开始交易
- 更新图书实例
- 提交事务。
与我的预期相反,我注意到更新 Book 并没有传播和持久化瞬态 Author 实例。Author 实例仍然是瞬态的。
现在,如果我将FlushMode 设置为 AUTO(default),不仅会提交临时作者,还会在 BookAuthor 表中创建一个关系。
令我惊讶的是,flush() 可以发挥如此重要的作用。
难道我做错了什么?
问候,
沙杜尔。