【发布时间】:2012-01-29 11:46:21
【问题描述】:
我一直在研究 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 实例中的 authors 集。
- 开始交易
- 更新图书实例
- 提交事务。
与我的预期相反,我注意到更新 Book NOT 传播并保留了瞬态 Author 实例。 Author 实例仍然是瞬态的。
现在,如果我将 FlushMode 设置为 AUTO(默认),不仅会提交临时作者,还会在 BookAuthor 表中创建一个关系。
我很惊讶flush() 可以发挥如此重要的作用。
我是不是做错了什么?
问候,
沙杜尔。
【问题讨论】:
标签: hibernate cascade flush object-state