jpa - 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(employee);
}

updateStudent(student) {
    studentDAO.update(student);
}

但是当我运行它时,我得到这样的日志:

开始升级...

更新 com.sk.entity.Employee 设置 ...

更新 com.sk.entity.Student 设置...

结束:更新...

openjpa.jdbc.SQL - 正在执行 prepstmnt 2036496738 UPDATE STUDENT SET...

openjpa.jdbc.SQL - 执行 prepstmnt 2036496738 UPDATE EMPLOYEE SET ...

在这里我仍然没有得到:
  • 为什么在我调用 updateEmplyoee 方法时不会立即执行更新查询。可以看到在我的日志语句“END:Update...”之后打印sql的日志
  • 为什么 STUDENT 表首先更新。根据方法调用,我首先调用 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(...) {...}
    

    关于jpa - OpenJPA 查询何时执行以及什么是顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19734225/

    相关文章:

    java - 如何用JPQL编写查询?

    java - Spring-data-jpa NativeQuery 具有两个输出参数

    java - JPA 实体的集合成员分离或不受管理

    java - JPA/Hibernate 批量(批量)插入

    java - OpenJPA native 查询如何将 IN 运算符与列表一起使用

    mysql - EclipseLink、JPA、Mysql 关闭自动提交

    java - 当一对多关系的火合并时,Hibernate 抛出 EntityNotFoundException

    html - 了解有关 DOM 和脚本执行的 HTTP 请求/响应

    c++ - kdevelop 没有指定有效的可执行文件

    python - VSCode : Using the MS Python extension cannot execute code