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;
}
}
}
正如你所看到的功能是相当简单:
- 从数据库
- 遍历对象
- 更新每个对象的状态
- 在获取对象结束提交更改
一切运行正常,但对象不更新数据库,并没有例外。
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");
}
}
请添加您的dao。此外,你的代码是有缺陷的,万一你应该回滚事务,目前你有连接泄漏。另外你为什么甚至自己管理交易?让spring通过简单的方法来处理事务,节省您编写繁琐的tx代码。 –
@ M.Deinum这是您要求的信息。我遵循你的建议,并决定使用交易注释,但不解决问题。 – Darwiin