在我们的java项目中,我们使用了带有hibernate和spring的ORM。我在删除持久化对象时遇到了问题。例如,此示例方法按ids获取实体,然后删除它们:
@Transactional
public void remove(List<Long> ids) {
SearchTemplate template = new SearchTemplate();
template.addParameter("milestoneId",ids);
List <InvoiceQueue> items = this.findByCriteria(template);
...
this.delete(items);
}方法执行Ok,没有任何异常,但实际上并没有从数据库中删除这些项。
将以下注释添加到方法定义@Transactional(propagation = Propagation.REQUIRES_NEW)解决了这个问题。
有人能解释为什么它不能与默认的传播类型PROPAGATION_REQUIRED一起工作吗?
提前谢谢。
环境详细信息:
hibernate.version 3.5.5-最终版,spring.version 3.0.5.RELEASE
发布于 2012-05-22 15:58:50
实际上只是重复@PeterBagyinszki在他的评论中所说的话,但原因很可能是发生删除的事务由于某些其他部分抛出异常而被回滚,并且在事务期间所做的所有更改都被取消。对于Propagation.REQUIRES_NEW,删除是在它自己的独立嵌套事务中完成的。嵌套事务(提交或回滚)的结果不会影响“外部”事务,反之亦然。
检查您的日志以了解是什么导致事务回滚,请注意,即使是像NoResultException这样的简单SELECT -query失败也会导致事务回滚,除非您在@Transactional-annotation中明确声明在某些异常情况下不回滚。
https://stackoverflow.com/questions/10674731
复制相似问题