当前位置: 首页 > 知识库问答 >
问题:

Spring数据不保存实体

巩阳秋
2023-03-14

我有一个问题,Spring数据没有保存实体。应用程序逻辑如下:

  1. 另一个应用程序正在监听负载相当重的Kafka主题(每秒数十条消息)并将消息插入数据库中具有“NEW”状态的表中。
  2. @调度方法加载一个具有“NEW”状态的实体列表,这些实体被一个接一个地传输到FixedThreadPool(20个线程),它们的状态设置为“PROCESSING”和一个saveAll方法调用同一个表。
@Scheduled(fixedDelay = 10_000)
public void scheduled() {
    Pageable pageable = PageRequest.of(0, pageSize);
    List<EntityClass> entities = entityService.getAllByStatusOrderByIdDesc(NEW_STATUS, pageable);

    while (!entities.isEmpty()) {
        entities.forEach(entity -> {
            entity.setStatus(PROCESSING_STATUS);
            process(entity);
        });

        entityService.saveAll(entities);
        loggers = entityService.getAllByStatusOrderByIdDesc(NEW_STATUS, pageable);
    }

private void process(Entity entity) {
    threadPool.execute(
         () -> processor.execute(
            TaskBuilder.entity(entity).build()
         )
    );
}
...
log.info("[SaveStep] [execute] status before {}", entity.getStatus());
Entity entity = entityService.save(entity);
log.info("[SaveStep] [execute] status after {}", entity.getStatus());

这两种日志方法都显示正确的状态(“OK”或“ERROR”),但数据库行始终包含“PROCESSING”状态。我试着重做一个实体服务。save()有多种变体(entityRepository是一种常规的JPARepository):

  1. 常规repo.save()不起作用:
public Entity save(Entity entity) {
   return repository.save(logger);
}
@Transactional
public Entity save(Entity entity) {
   Entity saved = repository.getFirstById(entity.getId());
   saved.setStatus(entity.getStatus());
   return repository.save(saved);
}
@Transactional
public Entity save(Entity entity) {
   Entity saved = repository.getFirstById(entity.getId());
   log.info("[Service] [save] status before {}", saved.getStatus());
   saved.setStatus(entity.getStatus());
   log.info("[Service] [save] status after {}", saved.getStatus());
   return repository.save(saved);
}
@Modifying
@Transactional
@Query(value = "UPDATE entity_table_name set status = :status where id = :id", nativeQuery = true)
void updateStatus(@Param("id") Long id, @Param("status") String status);

目前我没有办法尝试。主要的侮辱是,大多数实体最终被数据库正确地消化,只有大约20%被save()忽略,没有抛出任何异常。

共有2个答案

丌官晔
2023-03-14

谢谢泰勒,他绝对正确地指出了我的问题。即使在调度器点击saveAll(“处理”)行之前,实体列表已经被并行处理,并以足够快的速度以正确的状态保存,这会导致状态重写。

苏磊
2023-03-14

您将消息提交到池后设置为“处理”,这意味着池可能会先访问它,而“处理”更新可能会在之后发生。不确定这是否是您的问题,但您正在做的事情有可能。在提交到池之前尝试设置并保存/提交“处理”更新。

 类似资料:
  • 我有一个使用JPA的Spring Boot应用程序,它有两个数据源,一个用于DB2,一个用于SQL Server。 当我尝试将实体保存到SQL Server时,不会抛出任何错误,但该实体不会持久化到数据库。我看不到日志中正在生成插入。 提前感谢 下面是我尝试保存实体所执行的代码@组成部分 下面是sql Server配置。 这是SQL Server存储库 公共接口BeercupMessageLogR

  • 我在使用JPA时遇到了一些困难。我没有得到任何异常,但我不能保存任何东西到数据库。我从Hibernate到Jpa,在那里一切都工作得很好。下面是我的文件 Application.Properties: 存储库: 服务: 我在提交表单时得到了200的响应,但在数据库中找不到数据

  • 我有跟风问题 我有一个Spring数据Rest的基本配置(没有花哨,没有自定义)。 使用spring数据rest webmvc 2.0.0版本和spring数据jpa 1.5.0版本 A类 B类 存储库A 存储库B 当我拯救一个实体时工作正常,但我不知道如何拯救一段关系 e、 g.使用http将“A”保存在“B”中 这是我从这个答案中尝试的最后一件事https://stackoverflow.co

  • 我是Hibernate的新手,并要求使用具有这些列的表的数据库 表:TBL _ product//库存项目列表< br >列:< br > key _ product < br > key _ category < br > fld _ product _ name < br > fld _ Inventory _ qty < br > fld _ unit _ price < br > fld

  • 我有一个Spring应用程序,其中Domain Object标识符不是由数据库分配的,而是由应用程序生成的。标识符是在BeforeSave回调期间生成并添加到Domain Object中的。保存域对象(插入)后,当尝试保存具有相同标识符的域对象(更新)时,我收到以下错误 原因:组织。springframework。道。Incorrectupdatesemanticdataaccessexcepti