使用Spring JpaTransactionManager静默提交失败

达尔文

我正在研究一个由队友开发的项目,但是我们面临着一个使我发疯的奇怪问题:数据库从未更新,日志中也没有例外。这是代码:

@Service
@Transactional
public class InterventionProjectResultIntegrator implements IInterventionProjectResultIntegrator {

  private static final ILogger logger = ComponentLogger.getInstance(InterventionProjectResultIntegrator.class);

  private Dao dao;
  private String APPLICATION = "APP";

  @Autowired
  public void setDao(Dao dao){
    this.dao = dao; 
  }

  @Override
  public void integrateResponse() {

    try {
      List<ResponseEntity> responseListByStatus = dao.findAllResponseByStatus(Dao.STATUS_EN_COURS, APPLICATION);

      for (ResponseEntity response: responseListByStatus ) {
        response.setStatus(Dao.STATUS_OK);
        dao.mergeResponseEntity(response);
      }
    } catch (Exception ex) {
      logger.error(ex.getMessage(), ex);
      throw ex;
    }
  }
}

如您所见,该函数非常简单:

  1. 从数据库获取对象
  2. 循环遍历对象
  3. 更新每个对象的状态
  4. 在循环结束时,提交更改

除了对象没有在数据库上更新并且没有异常之外,其他所有东西都运行良好。

Dao来自一个maven依赖项,该依赖项在另一个项目中运行良好,因此我认为问题与新项目有关。

我可以在控制台中看到以下日志:

org.springframework.transaction.support.TransactionSynchronizationManager - Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@6dcee890] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@713e49c3] bound to thread org.hibernate.event.internal.AbstractSaveEventListener - Persistent instance of: com.domain.ResponseEntity
org.hibernate.event.internal.DefaultMergeEventListener - Ignoring persistent instance
org.hibernate.action.internal.UnresolvedEntityInsertActions - No entity insert actions have non-nullable, transient entity dependencies.

您是否已经面临过类似的问题?

问候。

[编辑1]

正如评论中指出的那样,我用@Transactional注释替换了手动事务处理查看更新的代码。

所以现在我在日志中有一个新行,但结果相同,对象未保存在数据库中。

org.springframework.transaction.interceptor.TransactionAspectSupport - Completing transaction for [com.response.InterventionProjectResultIntegrator.integrateResponse]

如DAO来源所问。该代码不在我的责任范围内,并且在另一个上下文中像灵符一样工作。

@Repository
public class Dao {
  public static final ILogger logger = ComponentLogger.getInstance(Dao.class);

  public static final String STATUS_EN_COURS = "PENDING";
  public static final String STATUS_OK = "OK";
  public static final String STATUS_ERROR = "ERROR";

  @PersistenceContext
  protected EntityManager entityManager;

  public void setEntityManager(EntityManager entityManager) {
    this.entityManager = entityManager;
  }

  public void mergeMvzResponseEntity(ResponseEntity responseEntity) {
    if(entityManager != null) {
      this.entityManager.merge(responseEntity);
    } else {
      logger.error("Entity manager not initialized");
    }
}
达尔文

如建议的那样,我对源代码进行了重做,以使用@Transactional批注,并让Spring处理事务:

@Service
@Transactional
public class InterventionProjectResultIntegrator implements IInterventionProjectResultIntegrator {

  private static final ILogger logger = ComponentLogger.getInstance(InterventionProjectResultIntegrator.class);

  private Dao dao;
  private String APPLICATION = "APP";

  @Autowired
  public void setDao(Dao dao){
    this.dao = dao; 
  }

  @Override
  public void integrateResponse() {

    try {
      List<ResponseEntity> responseListByStatus = dao.findAllResponseByStatus(Dao.STATUS_EN_COURS, APPLICATION);

      for (ResponseEntity response: responseListByStatus ) {
        response.setStatus(Dao.STATUS_OK);
        dao.mergeResponseEntity(response);
      }
    } catch (Exception ex) {
      logger.error(ex.getMessage(), ex);
      throw ex;
    }
  }
}

然后将此行添加到我的xml配置文件中:

<tx:annotation-driven/>

现在,它就像一种魅力。感谢@M。Deinum指出了这一点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Nhibernate静默插入失败

来自分类Dev

如何使用Gnome扩展(静默安装失败)

来自分类Dev

如何使用Gnome扩展(静默安装失败)

来自分类Dev

在 bash 别名中使用时,xargs 命令以静默方式失败

来自分类常见问题

使用--amend重写提交后,CodeCommit失败

来自分类Dev

使用--amend重写提交后,CodeCommit失败

来自分类Dev

使用perforce时提交文件失败

来自分类Dev

gitlab使用PHP通过cURL提交失败

来自分类Dev

使用react hooks提交失败后恢复表单提交状态

来自分类Dev

在自定义复合控件中使用时,Inflater静默失败

来自分类Dev

使用Java脚本提交Spring Form

来自分类Dev

使用Spring测试在测试中提交事务

来自分类Dev

如何使用Spring Weblow提交表单

来自分类Dev

Couchbase CBQ静默失败

来自分类Dev

chmod 600静默失败

来自分类Dev

Couchbase CBQ静默失败

来自分类Dev

getJSON 静默失败

来自分类Dev

使用Spring进行依赖注入失败

来自分类Dev

使用JWT和Spring时登录失败

来自分类Dev

使用 DataJpaTest spring boot 2.1.0 更新失败

来自分类Dev

使用JQuery使用动态字段进行Grails表单提交失败

来自分类Dev

为什么在JpaTransactionManager中使用jpadialect

来自分类Dev

使用ajax提交时文件上传失败,返回false

来自分类Dev

使用Xcode 5提交时,校验和验证失败

来自分类Dev

在提交失败时坚持使用jQuery-Rails

来自分类Dev

使用JQuery的带有动态字段的Grails表单提交失败

来自分类Dev

使用外部API验证失败时提交的Javascript表单

来自分类Dev

Angular 单元测试在使用(提交)时失败

来自分类Dev

使用boto3客户端提交时,火花提交EMR步骤失败