当OpenJPA查询执行时,什么是订单

时间:2013-11-01 19:42:34

标签: jpa execution 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 e set ...
更新com.sk.entity.Student s set ...
结束:更新......
openjpa.jdbc.SQL - 执行prepstmnt 2036496738 更新学生集......
openjpa.jdbc.SQL - 执行prepstmnt 2036496738 更新员工集......

我仍然没有得到:

  • 为什么在我调用updateEmplyoee方法时不会执行更新查询。您可以在我的日志语句“END:Update ...”

  • 之后看到sql打印的日志
  • 为什么STUDENT表会先获得更新。根据方法调用,我首先调用updateEmployee

任何人都可以回答,如果你知道我错过了什么。

1 个答案:

答案 0 :(得分:4)

关于交易处理。您的事务通常在从非EJB环境调用EJB方法时启动,并在同一EJB方法结束时完成。因此updateEmployee和updateStudent在相同的EJB(JTA)事务中运行。

调用update()时,EJB事务启动。调用updateEmployee和updateStudent时,更改将保存在内存中。在update()方法结束时,当事务看起来成功时,OpenJPA开始以任何顺序将所有非持久性更改从内存持久保存到数据库。如果持久保存这些更改,则将提交发送到数据库。如果数据库提交成功,那么它会成功完成EJB事务。

如果要以相同的顺序保存数据,可以使用EntityManager的flush()方法。或者,您可以为updateStudent和updateEmployee方法启动新事务:

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