2013-11-01 1 views
3

Я ударяю головой по проблеме с 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); 
} 

Но когда я запускаю это я получаю журналы, как это:

START: Обновление ...
обновление com.sk.entity.Employee е набор ...
обновление com.sk.entity.Student, настроил ...
END: обновление ...
openjpa.j dbc.SQL - выполнение prepstmnt 2036496738 UPDATE СТУДЕНТ SET ...
openjpa.jdbc.SQL - выполнение prepstmnt 2036496738 UPDATE EMPLOYEE SET ...

Вот я до сих пор не получаю:

  • Почему запросы обновления не выполняются, как только я вызываю метод updateEmplyoee. Вы можете увидеть журнал, который будет напечатан sql после моего оператора журнала «END: Update ...»

  • Почему таблица STUDENT обновляется в первую очередь. В соответствии с методом, вызывающим я вызываю updateEmployee сначала

Может ли кто-нибудь ответить, если вы знаете, что мне не хватает.

ответ

4

Речь идет о сделке. Ваша транзакция обычно начинается при вызове метода EJB из среды, отличной от EJB, и заканчивается в конце того же метода EJB. Таким образом, updateEmployee и updateStudent запускаются в одной транзакции EJB (JTA).

При вызове update() начинается транзакция EJB. При вызове updateEmployee и updateStudent изменения сохраняются в памяти. В конце метода update(), когда транзакция кажется успешной, OpenJPA начинает сохранять все неизменные изменения из памяти в базу данных в любом порядке. Если сохранение этих изменений преуспело, то отправляет фиксацию в базу данных. Если фиксация базы данных преуспела, она успешно завершает транзакцию EJB.

Если вы хотите сохранить данные в том же порядке, вы можете использовать метод flush() EntityManager. Или вы можете начать новую транзакцию для updateStudent и updateEmployee методов:

@TransactionAttribute(REQUIRES_NEW) 
public void updateStudent(...) {...} 
+0

Хорошо, как я могу убедиться, что, когда я называю updateEmployee и updateStudent, JPA должны сохраняться все не-сохранялись изменения в базе данных (не держать в памяти). И, во-вторых, я до сих пор не понял, почему таблица STUDENT сохраняется в первую очередь. – SKumar

+0

EntityManager имеет метод flush(). –

+0

Или вы можете начать новую транзакцию, я добавлю ее в ответ: @TransactionAttribute (REQUIRES_NEW) public void updateStudent (...) {...} –