Когда метод EntityManager flush() возвращается?

Я использую EntityManager для сохранения данных в моей базе данных.

public void save(X x){
    entityManager.persist(x);
    entityManager.flush();
    triggerDataChange();
}

После очистки данных я вызываю метод triggerDataChange() для отправки сообщения внешнему компоненту, который зависит от вновь записанных данных.

Вопрос: Могу ли я полагаться на то, что метод сброса возвращает после того, что данные были успешно записаны в базу данных?

Спасибо за вашу помощь.


person herzrasen    schedule 21.02.2012    source источник
comment
Да, сброс фиксирует изменения в БД. (Но его все еще можно откатить.)   -  person K.C.    schedule 21.02.2012
comment
Кстати: если вы используете спящий режим, посмотрите возможные режимы сброса: docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/   -  person K.C.    schedule 21.02.2012
comment
Я думаю, когда он говорит, что вносит изменения в БД, он имеет в виду, что не вносит изменения в БД 8=}. Ваше другое приложение должно будет прочитать незафиксированные данные из базы данных, что не является обычным делом. На самом деле вы, вероятно, хотите зафиксировать данные (т.е. завершить транзакцию), а затем вызвать вашу внешнюю систему. В противном случае внешняя система могла бы принять решение на основе данных, которые можно было бы откатить.   -  person davidfrancis    schedule 21.02.2012
comment
@davidfrancis Извините, я не понимаю. Может быть, это мой английский (не носитель языка). Я думал, что это было следующим образом: entityManager.flush() : очистить внутренний кеш инструкций SQL и немедленно выполнить его в базе данных. См.: stackoverflow.com/questions /4275111/   -  person K.C.    schedule 21.02.2012
comment
Я полагаю, что ваш английский намного лучше, чем мои жалкие попытки на вашем родном языке!! Да, это зависит от вашего определения фиксации. Лично я бы избегал использования фиксации в терминах базы данных, если вы не имеете в виду фиксацию транзакции - вероятно, лучше сказать «постоянно». например flush сохраняет данные в базе данных, но их все еще можно откатить.   -  person davidfrancis    schedule 21.02.2012
comment
Ах да, я пытался сказать это. Спасибо за разъяснения.   -  person K.C.    schedule 21.02.2012


Ответы (1)


Ваша транзакция такая же, поэтому, даже если транзакция откатывается, она полностью откатывается. Flush не зафиксирует транзакцию, так как ее все еще можно откатить. Итак, в вашей реализации все, что вы делаете, в порядке.

person Amit Deshpande    schedule 27.03.2012