Когда выполняется запрос OpenJPA и что такое порядок
Я бьюсь головой о проблему с OpenJPA.
У меня есть метод:
public void update() {
System.out.println("START: Update...");
updateEmployee(employee);
updateStudent(student);
System.out.println("END: Update...");
}
updateEmployee(employee) {
employeeDAO.update(employee);
}
updateStudent(student) {
studentDAO.update(student);
}
Но когда я запускаю это, я получаю такие журналы:
Начало: обновление...
Обновление через COM.СК.лица.Сотрудник электронного набора ...
Обновление через COM.СК.лица.Набор студенческий ...
Конец: обновление...
openjpa.интерфейс jdbc.SQL-выполнение prepstmnt 2036496738 обновить набор учащихся...
openjpa.интерфейс jdbc.SQL-выполнение prepstmnt 2036496738 обновить набор сотрудников ...
Здесь Я все еще не получаю:
-
Почему запросы обновления не выполняются, как только я вызываю метод updateEmplyoee. Вы можете увидеть журнал, который sql печатается после моей инструкции log " END: Update..."
-
Почему таблица студентов обновляется в первую очередь. В соответствии с вызовом метода я вызываю updateEmployee сначала
1 ответ:
Речь идет об обработке транзакций. Транзакция обычно начинается при вызове метода EJB из среды, отличной от EJB, и заканчивается в конце того же метода EJB. Поэтому updateEmployee и updateStudent выполняются в одной транзакции EJB (JTA).
При вызове update () запускается транзакция EJB. При вызове updateEmployee и updateStudent изменения сохраняются в памяти. В конце метода update (), когда транзакция кажется успешной, OpenJPA начинает сохранять все несохраняемые изменения из памяти в базу данных в любом порядке. Если сохранение этих изменений прошло успешно, то отправляется фиксация в базу данных. Если фиксация базы данных прошла успешно, то транзакция EJB завершается успешно.
Если вы хотите сохранить данные в том же порядке, вы можете использовать метод flush() в EntityManager. Или вы можете запустить новую транзакцию для методов updateStudent и updateEmployee:
@TransactionAttribute(REQUIRES_NEW) public void updateStudent(...) {...}