私はいつか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があります。
これが私がしていることです。
- FlushModeをMANUALに設定します
- データベースから本を入手する
- 新しい作成者を作成します。(一時的)
- Bookインスタンスで設定された作成者に作成者を追加します。
- トランザクションを開始します
- ブックインスタンスを更新する
- トランザクションをコミットします。
私の予想に反して、Bookの更新が一時的なAuthorインスタンスを伝播および永続化していないことに気付きました。Authorインスタンスはまだ一時的です。
ここで、FlushModeをAUTO(デフォルト)に設定すると、一時的な作成者がコミットされるだけでなく、関係もBookAuthorテーブルに作成されます。
flush()が非常に重要な役割を果たしていることを知って驚いています。
私は何か間違ったことをしていますか?
よろしく、
シャードゥル。