gpt4 book ai didi

hibernate - 事务提交后的事件 Spring JPA

转载 作者:行者123 更新时间:2023-12-03 19:55:43 29 4
gpt4 key购买 nike

事务提交成功后我需要做一些具体的 Action ,基本包括我对数据的分析操作;

我尝试使用以下代码片段

public class EntityEventHandlers {
private static Logger logger = LoggerFactory.getLogger(EntityEventHandlers.class);

@Autowired
private AsyncEventBus async;

@PostUpdate
public void postUpdate(Order order) {
AutowireHelper.autowire(this, this.async);
logger.debug("post update called " + order.getId());
async.post(new ESCreateOrderEvent(order));
}

@PostPersist
public void postPersist(Order order) {
AutowireHelper.autowire(this, this.async);
logger.debug("post insert called " + order.getId());
async.post(new ESCreateOrderEvent(order));
}
}

但是发现当我的订单没有坚持时。

有人可以告诉我一个更好的解决方案,我可以在事务提交成功后触发一些操作。

我听说(尝试使用)@TransactionEventListener,但没有看到任何触发。

Updated the source


@Component
public class TXEventHandler {
@TransactionalEventListener
public void doAfterCommit(ApplicationEvent event){
//process here
}
}

关于申请
它是一个基于 4.2.0 的 Spring MVC,并使用 Hibernate 和 MySql 作为数据库。

现在我已经通过将事件放入延迟队列解决了这个问题,并且延迟足以发生数据库提交。但我知道这不是一个好的解决方案。所以如果有人遇到过这个问题并且能够解决它,请告诉我。

提前致谢。

最佳答案

假设,正如您的评论所提到的,您正在使用实体管理器来持久化/合并您的实体对象,您可能有一个连接它的 Bean。如果是这样,那么为了利用 @TransactionalEventListener,您希望连接 ApplicationEventPublisher bean 角,扁 bean 。你的类(class)可能看起来像:

@Component
public class OrderManager {
@PersistenceContext
protected EntityManager entityManager;

// You need this Spring bean
@Autowired
private ApplicationEventPublisher applicationEventPublisher;

// ...
@Transactional
public void saveOrder(Order newOrder) {
entityManager.persist(newOrder);
applicationEventPublisher.publishEvent(new OrderEvent());
}

@TransactionalEventListener
public void doAfterCommit(OrderEvent event){
//process here
}

// inner class for brevity, you may not want to do this in practice
public static class OrderEvent {
}
}

这段代码(虽然可怕地放在一个类中......)只是为了说明这一点:如果你想要@TransactionalEventListener 触发,那么你需要(至少):
  • 在 Spring 管理的 bean 中定义它
  • 在@Transactional 所在的某个地方连接“ApplicationEventPublisher”(不必是步骤 1 中的同一个 bean)
  • 在@Transactional 方法中调用“applicationEventPublisher.publishEvent()”

  • 默认行为将在提交完成且实体管理器刷新后触发 TransactionalEventListener,但仍在事务范围内。您可以使用 'phase' 参数在注释中更改此设置,但这应该足以解决您的问题。

    附:您可以从 https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2 中收集大部分内容正如 JB Nizet 所说

    关于hibernate - 事务提交后的事件 Spring JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32677747/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com