java - 在方法完成之前未写入数据库的 JPA 更改

标签 java jpa jakarta-ee java-ee-7

我有一个@Stateless-Bean,它在单个方法中执行一些数据库操作

public void doOperation(){
    User u1 = createNewUser()
    User u2 = createNewUser()
    User updated = mergeUser(u1,u2) // just as an example
    // should write to database now! 
    otherBlockingOperation()
}

但是,在阻塞操作完成之前,更改在数据库中不可见,因此在前端中不可见。

我认为这是因为在 otherBlockingOperation() 完成之前事务没有提交。然后我将 otherBlockingOperation() 包装在一个线程中,但它不再起作用。

但是我认为真正的问题是merge,它只会在方法完成后更新实体。如何立即更改 Object 的值?

编辑:

@PersistanceContext
private EntityManager em;
mergeUser(T entity){
    em.merge(entity);
    em.flush();
}

最佳答案

根据实际业务需求,可能的解决方案是将 otherBlockingOperation() 方法移至新的 @Stateless bean 并将该方法标记为 @Asynchronous @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)。这将有效地在新线程和新事务中运行该方法。您只需@Inject新bean并调用otherBlockingOperation()方法即可。

新事务可能(或可能不是)是有效选项,具体取决于业务需求(即新事务可能会失败,而原始事务可能会成功)。但是,更新将更快地在数据库中提交(但仍在提交原始事务之后),而不依赖于 otherBlockingOperation() 进程(甚至成功提交)。

关于java - 在方法完成之前未写入数据库的 JPA 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55302110/

相关文章:

java - 如何在java中将一个枚举转换为另一个枚举?

Java 代码 - 相同代码在不同操作系统中的不同结果

java - JPQL:解析查询时出现语法错误,意外标记

jakarta-ee - JAX-RS Jersey : @XmlElementWrapper returns

java - 如何重命名ireport中ejbql查询的字段?

java - 将 json 对象中的日期发送到 Restful ws

java - 如何将对象作为参数传递给 onClick 上的 javascript 函数

java - 我无法刷新 ListView

JPA,模式或反模式 : to have both flat and related sets of mappings?

java - jpa 存储库有 2 个相同的方法