我正在创建一个团队仪表板,其中包含 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);
}
}
}
看起来已经是事务上下文了,也许缺少的是
flush
。
teamData.values().forEach(em::persist);
em.flush(); // Ensure the persistence context is synchronized with the database
teamData.values().forEach(System.out::println);