OpenJPA 查询何时执行以及啥是顺序

Posted

技术标签:

【中文标题】OpenJPA 查询何时执行以及啥是顺序【英文标题】:When OpenJPA query executes and what is orderOpenJPA 查询何时执行以及什么是顺序 【发布时间】:2013-11-01 19:42:34 【问题描述】:

我在思考 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 集... 更新 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

如果你知道我错过了什么,请回复。

【问题讨论】:

【参考方案1】:

这是关于事务处理的。您的事务通常在从非 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 应该将所有非持久更改保留在数据库中(不保留在内存中)。其次,我仍然不明白为什么 STUDENT 表首先存在。 EntityManager 有一个 flush() 方法。 或者你可以开始一个新的交易,我把它添加到答案中:@TransactionAttribute(REQUIRES_NEW) public void updateStudent(...) ...

以上是关于OpenJPA 查询何时执行以及啥是顺序的主要内容,如果未能解决你的问题,请参考以下文章

利用OpenJ9大幅度降低JAVA内存占用

究竟啥是 getattr() 以及如何使用它?

OpenJPA:JPQL 与本机查询

Java 中的 Mono 类:啥是,何时使用?

OpenJPA 查询验证错误

OpenJPA/MySQL:在 where 子句中使用同一张表时修改表