2016-09-26 24 views
0

我在一个由队友开发的项目上工作,但我们面临着一个让我疯狂的奇怪问题:数据库从不更新,日志中也没有例外。下面的代码:使用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 [[email protected]] for key [org[email protected]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. 

你已经面临着类似的问题?

问候。

[EDIT 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"); 
    } 
} 
+1

请添加您的dao。此外,你的代码是有缺陷的,万一你应该回滚事务,目前你有连接泄漏。另外你为什么甚至自己管理交易?让spring通过简单的方法来处理事务,节省您编写繁琐的tx代码。 –

+0

@ M.Deinum这是您要求的信息。我遵循你的建议,并决定使用交易注释,但不解决问题。 – Darwiin

回答

0

至于建议,我已经修改了源代码,使用@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指出了这一点。