我正在研究一个由队友开发的项目,但是我们面临着一个使我发疯的奇怪问题:数据库从未更新,日志中也没有例外。这是代码:
@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 [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] 删除。
我来说两句