0

私はいつか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. Bookインスタンスで設定された作成者に作成者を追加します。
  5. トランザクションを開始します
  6. ブックインスタンスを更新する
  7. トランザクションをコミットします。

私の予想に反して、Bookの更新が一時的なAuthorインスタンスを伝播および永続化していないことに気付きました。Authorインスタンスはまだ一時的です。

ここで、FlushModeをAUTO(デフォルト)に設定すると、一時的な作成者がコミットされるだけでなく、関係もBookAuthorテーブルに作成されます。

flush()が非常に重要な役割を果たしていることを知って驚いています。

私は何か間違ったことをしていますか?

よろしく、

シャードゥル。

4

1 に答える 1

0

flushデータベースに変更を書き込むメソッドです。フラッシュしないと、何も書き込まれません。したがって、明らかに、フラッシュモードを手動に設定し、フラッシュを呼び出さない場合、データベースには何も書き込まれません。

于 2012-01-29T12:17:03.403 に答える