当OpenJPA查询执行时,顺序是什么

当OpenJPA查询执行时,顺序是什么,jpa,execution,openjpa,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(employ

我正在和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.sk.entity.Employee e set。。。
更新com.sk.entity.Student的集合。。。
结束:更新。。。
openjpa.jdbc.SQL-正在执行prepstmnt 2036496738更新学生集。。。
openjpa.jdbc.SQL-正在执行prepstmnt 2036496738更新员工集。。。

在这里,我仍然没有得到:

  • 为什么在调用updateEmplyoee方法时不立即执行更新查询。您可以看到在我的日志语句“END:Update…”之后打印sql的日志

  • 为什么首先更新学生表。根据方法调用,我首先调用updateEmployee


如果你知道我遗漏了什么,请任何人回复。

这是关于交易处理的。您的事务通常在从非EJB环境调用EJB方法时开始,并在同一EJB方法的末尾结束。因此,updateEmployee和updateStudent在同一个EJB(JTA)事务中运行

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


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

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

好的,我如何确保在调用updateEmployee和updateStudent时,JPA应该在数据库中持久化所有未持久化的更改(而不是保留在内存中)。第二,我仍然不明白为什么学生表首先是持久的。EntityManager有一个flush()方法。或者您可以启动一个新事务,我将它添加到答案中:@TransactionAttribute(REQUIRES_new)public void updateStudent(…){…}