Когда выполняется запрос 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 3

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(...) {...}