entityManager persist 不持久化任何数据

问题描述 投票:0回答:1

我正在创建一个团队仪表板,其中包含 csv 文件中的匹配项。我正在创建两个实体 - 匹配和团队。我正在使用 Spring Batch 将匹配项加载到 postgre 中,并且加载正常。我可以通过查询 postgre 数据库来验证数据加载是否完成。批处理作业完成后,我想运行一些查询来聚合我正在使用 EntityManager 的数据。当我从 EntityManager 持久保存时,我在数据库中看不到任何数据,也没有看到任何错误。我尝试输出存储在 hashMap 中的数据,我看到了我想存储在数据库 Team 表中的数据。我坚持的方式可能出了什么问题?

import com.project.dashboard.model.Team;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobExecutionListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;

@Component
public class JobCompletionNotificationListener implements JobExecutionListener {

    private static final Logger log = LoggerFactory.getLogger(JobCompletionNotificationListener.class);

    @PersistenceContext
    private final EntityManager em;

    @Autowired
    public JobCompletionNotificationListener(EntityManager em) {
        this.em = em;
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void afterJob(JobExecution jobExecution) {
        if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
            log.info("!!! JOB FINISHED! Time to verify the results");

            Map<String, Team> teamData = new HashMap<>();

            em.createQuery("select m.team1, count(*) from Match m group by m.team1", Object[].class)
                    .getResultList()
                    .stream()
                    .map(e -> new Team((String) e[0], (long) e[1]))
                    .forEach(team -> teamData.put(team.getTeamName(), team));

            em.createQuery("select m.team2, count(*) from Match m group by m.team2", Object[].class)
                    .getResultList()
                    .forEach(e -> {
                        Team team = teamData.get((String) e[0]);
                        team.setTotalMatches(team.getTotalMatches() + (long) e[1]);
                    });

           em.createQuery("select m.winner, count(*) from Match m group by m.winner", Object[].class)
                   .getResultList()
                   .forEach(e -> {
                       Team team = teamData.get((String) e[0]);
                       if(team!=null)
                       {
                           team.setTotalWins((team.getTotalWins() + (long) e[1]));
                       }
                    });

           teamData.values().forEach(em::persist);
           teamData.values().forEach(System.out::println);
        }

    }
}
java spring-boot
1个回答
0
投票

看起来已经是事务上下文了,也许缺少的是

flush

teamData.values().forEach(em::persist);
em.flush(); // Ensure the persistence context is synchronized with the database
teamData.values().forEach(System.out::println);
© www.soinside.com 2019 - 2024. All rights reserved.