Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate Spring数据Jpa saveAndFlush方法未立即提交会话_Hibernate_Spring Boot_Spring Data Jpa - Fatal编程技术网

Hibernate Spring数据Jpa saveAndFlush方法未立即提交会话

Hibernate 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);

我有一个保存新实体的服务方法,我需要自动生成的id,以便继续后续的逻辑,所以我使用saveAndFlush()方法。但是在下面的代码之前没有生成id

    @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始终具有值。