Я работаю над 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
- Получить книгу из базы данных
- Создать нового автора. (Transient)
- Добавление автора в авторов Набор в экземпляре Book.
- Начать транзакцию
- Обновление экземпляра книги
- Подтвердить транзакцию.
Вопреки моим ожиданиям, я заметил, что при обновлении Книги НЕ распространился и сохранил временный экземпляр Author. Экземпляр Author все еще временно.
Теперь, если я установлю для FlushMode значение AUTO (по умолчанию) , не только будет принят переходный Author, но и будет создана связь в таблице BookAuthor.
Я удивлен, узнав, что flush () играет такую важную роль.
Я что-то не так делаю?
С уважением,
Shardul.