Я работаю в Hibernate с того времени, и до сих пор я никогда не обращал внимания на метод flush().Hibernate flush() и Cascade.PERSIST
Я понимаю, что 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 на РУЧНЫЕ
- Получить книгу из базы данных
- Создать новый Автор. (Переходный период)
- Добавить автора в авторов Установить в экземпляре книги.
- начать транзакцию
- Обновление книги экземпляра
- Совершить транзакцию.
Вопреки моим ожиданиям, я заметил, что обновление Книга имеет НЕ распространяется и сохраняется переходный экземпляр Author. Экземпляр автора все еще преходящ.
Теперь, если я устанавливаю FlushMode в AUTO (по умолчанию), это не только прерывный автор, но и связь создается в таблице BookAuthor.
Я удивлен, узнав, что флеш() играет такую важную роль.
Я что-то не так?
С уважением,
Shardul.
ОО, у меня сложилось впечатление, что при совершении транзакции изменения записываются в базу данных. BTW, что эквивалентно flush(), когда я не использую Hibernate? –
Но тогда, когда я устанавливаю FlushMode в Manual и просто сохраняю/сохраняю простой объект, он отлично работает, даже если я не flush. Как это работает в этом сценарии? –
См. Http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#objectstate-flushing. Вероятно, это записано в базу данных, потому что вы используете собственное генерирование идентификаторов.Квивалент флеша в JPA ... флеш. См. Http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#flush%28%29. В чистом JDBC нет эквивалента, поскольку JDBC не имеет понятия постоянных объектов, хранящихся в кеше сеанса в памяти. –