Hibernate Spring数据Jpa saveAndFlush方法未立即提交会话
我有一个保存新实体的服务方法,我需要自动生成的id,以便继续后续的逻辑,所以我使用saveAndFlush()方法。但是在下面的代码之前没有生成idHibernate Spring数据Jpa saveAndFlush方法未立即提交会话,hibernate,spring-boot,spring-data-jpa,Hibernate,Spring Boot,Spring Data Jpa,我有一个保存新实体的服务方法,我需要自动生成的id,以便继续后续的逻辑,所以我使用saveAndFlush()方法。但是在下面的代码之前没有生成id @Transactional(rollbackFor = Exception.class) public void method1() { User user = new User(); User savedUser = userRepository.saveAndFlush(user);
@Transactional(rollbackFor = Exception.class)
public void method1() {
User user = new User();
User savedUser = userRepository.saveAndFlush(user);
// according to the logs on event listener, the id of savedUser is sometimes null
eventPublisher.publish(savedUser);
}
为什么saveAndFlush在发送事件之前不保存到DB和生成的id?eventPublisher.publish(savedUser)
这行代码位于transaction==>@Transactional(rollboor=Exception.class)中
做一件事
eventPublisher.publish(savedUser);在单独的线程中运行这个
使用以下代码:
@Transactional(rollbackFor = Exception.class)
public void method1() {
ExecutorService executor = null;
try {
User user = new User();
User savedUser = userRepository.saveAndFlush(user);
executor = Executors.newFixedThreadPool(5);
CompletableFuture.runAsync(() -> {
// according to the logs on event listener, the id of savedUser is sometimes
// null
eventPublisher.publish(savedUser);
}, executor);
} finally {
executor.shutdown();
}
}
刷新与提交不一样!。刷新仅向当前事务中的db发出挂起的sql语句,以便在tx中具有已知的有效状态。您仍然可以回滚。不要,因为在回滚的情况下也会发布消息(无论出于何种原因)。@M.Deinum那么在回滚的情况下如何避免发布,请给出一些代码示例。我希望在使用事务事件侦听器时,新id始终具有值。