2012-01-29 2 views
0

Я работаю в 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 в база данных.

Это то, что я делаю.

  1. Набор FlushMode на РУЧНЫЕ
  2. Получить книгу из базы данных
  3. Создать новый Автор. (Переходный период)
  4. Добавить автора в авторов Установить в экземпляре книги.
  5. начать транзакцию
  6. Обновление книги экземпляра
  7. Совершить транзакцию.

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

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

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

Я что-то не так?

С уважением,

Shardul.

ответ

0

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

+0

ОО, у меня сложилось впечатление, что при совершении транзакции изменения записываются в базу данных. BTW, что эквивалентно flush(), когда я не использую Hibernate? –

+0

Но тогда, когда я устанавливаю FlushMode в Manual и просто сохраняю/сохраняю простой объект, он отлично работает, даже если я не flush. Как это работает в этом сценарии? –

+1

См. 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 не имеет понятия постоянных объектов, хранящихся в кеше сеанса в памяти. –