Hibernate flush () и Cascade.PERSIST - PullRequest
       16

Hibernate flush () и Cascade.PERSIST

0 голосов
/ 29 января 2012

Я работаю над 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. Создать нового автора. (Transient)
  4. Добавление автора в авторов Набор в экземпляре Book.
  5. Начать транзакцию
  6. Обновление экземпляра книги
  7. Подтвердить транзакцию.

Вопреки моим ожиданиям, я заметил, что при обновлении Книги НЕ распространился и сохранил временный экземпляр Author. Экземпляр Author все еще временно.

Теперь, если я установлю для FlushMode значение AUTO (по умолчанию) , не только будет принят переходный Author, но и будет создана связь в таблице BookAuthor.

Я удивлен, узнав, что flush () играет такую ​​важную роль.

Я что-то не так делаю?

С уважением,

Shardul.

1 Ответ

0 голосов
/ 29 января 2012

flush - это метод, который записывает изменения в базу данных.Без промывки ничего не написано.Очевидно, что если вы установите режим сброса вручную и никогда не вызовете сброс, в базу данных ничего не будет записано.

...