当前位置: 首页 > 知识库问答 >
问题:

jpa@postpersist@postupdate仅在事务提交后

鲜于勇
2023-03-14

我正在使用手动事务时插入/更新3个表。我想在事务提交后立即插入到历史表中。这意味着有3个em.persist操作(针对每个表),只有在提交这些操作之后,我才希望调用一个方法。

这是我的代码:

@Resource
private EJBContext context;

public void save(Object obj)
{
    try 
    {     
        transaction = context.getUserTransaction();
        transaction.begin();

        em.persist(obj);

        sb2.save(obj);  //persist in  sb2                         
        sb3.save(obj);  //persist in  sb2                         

        transaction.commit(); 
    }
    catch (Exception exp) 
    {
       transaction.rollback();        
    }   
 }

有什么post commit方法吗?如何在提交之后而不是持久之后调用方法?

共有1个答案

乜昆
2023-03-14

可以使用TransactionSynchronizationRegistry注册要在事务完成后执行的回调:

public class MyListener {

    // if you can't inject it with @Resource, you'll have to fetch it from JNDI
    @Resource
    private javax.transaction.TransactionSynchronizationRegistry registry;

    @PostUpdate
    public void postUpdate(final Object entity) {
        registry.registerInterposedSynchronization(new Synchronization() {

            public void beforeCompletion() {}

            public void afterCompletion(int status) {
                if (status == javax.transaction.Status.STATUS_COMMITTED) {
                    // Do something with your entity
                }
            }
        });
    }
}

然后用@EntityListeners(MyListener.class)注释您的实体(或者将其添加到orm.xml)。

 类似资料:
  • 上下文是带有Hibernate和Spring的Java-JPA。 让我们以两阶段提交协议的场景为例(但只有一个资源): > 要从应用程序提交的 查询 3.2如果没有 3.2.1回滚到数据库 我想要的是一种在代码中从3.1.1进行回调的方法,但只有当知道事务将被提交,但在实际提交之前。另外,如果在这里抛出异常,则应该回滚事务。 null

  • 问题内容: 我在正在使用的一个应用程序中使用Spring和Hibernate,但是在处理事务时遇到了问题。 我有一个服务类,该类从数据库中加载一些实体,修改它们的一些值,然后(当所有内容都有效时)将这些更改提交给数据库。如果新值无效(我只能在设置它们后检查),但我不想保留更改。为了防止Spring / Hibernate保存更改,我在方法中抛出异常。但是,这导致以下错误: 这是服务: 这就是我调用

  • 我在一个应用程序中使用Spring和Hibernate,我在处理事务时遇到了问题。 我有一个服务类,它从数据库加载一些实体,修改它们的一些值,然后(当一切都有效时)将这些更改提交给数据库。如果新值无效(我只能在设置它们后检查),我不想保留更改。为了防止Spring/Hibernate保存更改,我在方法中抛出一个异常。但是,这会导致以下错误: 这就是服务: 我就是这样调用它的: 我希望发生的事情是:

  • 我在使用Hibernate执行数据库更新时遇到了一个问题。当尝试repository.add(Object)操作时,它会给出一个验证异常。 我已经在模型类上添加了验证,但是我试图插入的值似乎满足了要求,所以我不知道问题出在哪里。 如果删除验证注释,repository.add(object)就可以成功完成,即。 好心看看有没有什么建议,提前谢谢。 MySQL(8.0.17)模式 Hibernate

  • 我在这里很困惑。JPA中的提交或回滚完成事务吗?我使用的是spring和容器管理的EntityManager。感谢任何回答。

  • 我在我的项目中做过类似的事情。我手动回滚事务,为此我插入了try-catch块并手动回滚catch块中的事务。现在我从method1调用method2,并将对象保存到method2()中的数据库中,但它不会将对象保存到数据库中。 我只是想知道什么是可能的解决方案,保存对象在方法2()在方法1()的faliure。 提前感谢。