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

标签 jpa jpa-2.0

我在使用手动事务时插入/更新 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();        
    }   
 }

是否有任何类型的提交后方法?
如何在提交之后而不是在持久之后调用方法?

最佳答案

您可以使用 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 中)。

关于jpa @postpersist @postupdate 仅在事务提交后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17511590/

相关文章:

jsf-2 - 如何在可排序数据表中按 JSF 标签排序

java - 如何针对可以并行运行的 JPA 编写 junit 测试?

hibernate - ReferencedColumnNames 未映射到单个属性

java - 在 EclipseLink 上使用投影时出现 NotReadablePropertyException

java - 防止 hibernate 实体更改被持久化

java - 在 CriteriaBuilder 查询的 groupBy 子句中包含实体

hibernate - TransactionRequiredException : Executing an update/delete query

java - JPA 实体创建 - 对象与 "Primitives"

postgresql - JPA/hibernate/PostgresDB 和 Vaadin 8 : SQL select query to get data from inherited tables and show in Vaadin grid

java - 如何在 OpenJPA 2.0.1 中禁用缓存(编辑 : Issues with BoneCP)