异常信息:org.eclipse.persistence.exceptions.OptimisticLockException
对象在其他的事物中被修改,而造成这一个问题的原因是:同时开启了两个事务,修改了同一个对象。解决方式就是:让对象在同一个事务中修改。
我使用的是cuba框架,这个框架可以使用 DataManager 来操作数据,也可以使用JPA的 EntityManager ,而DataManager每次执行都会新起一个事务。
就是因为开始不懂这些,以为这两个是同一回事,才出了错。
错误示例
首先使用了EntityManager查询了对象,然后又使用DataManager新开了事务进行提交,这样会报错
public void backEnd(UUID entityId) { Transaction tx = persistence.getTransaction(); try { EntityManager em = persistence.getEntityManager(); ExcelTable excelTable = em.find(ExcelTable.class, entityId); ProcInstance procInstanceNormal = ProcUtils.findProcInstanceNoDel(dataManager,excelTable); if(procInstanceNormal != null){ procInstanceNormal.setDescription("【销毁申请】已完成"); dataManager.commit(procInstanceNormal); } tx.commit(); } catch (Exception e) { logger.error("删除流程excelTable " + entityId + "发生错误:" + e.getMessage()); } finally { tx.end(); } }
正确用法
修改成只使用EntityManager来修改对象就没有问题了。
@Inject private Persistence persistence; @Inject private DataManager dataManager; public void backEnd(UUID entityId) { Transaction tx = persistence.getTransaction(); try { EntityManager em = persistence.getEntityManager(); ExcelTable excelTable = em.find(ExcelTable.class, entityId); ProcInstance procInstanceNormal = ProcUtils.findProcInstanceNoDel(dataManager,excelTable); if(procInstanceNormal != null){ procInstanceNormal.setDescription("【销毁申请】已完成"); em.merge(procInstanceNormal); em.flush(); } tx.commit(); } catch (Exception e) { logger.error("删除流程excelTable " + entityId + "发生错误:" + e.getMessage()); } finally { tx.end(); } }
原创文章,欢迎转载,转载请注明出处!
时间: 2024-11-09 05:55:19