我正在尝试删除一个实体,如果由于约束而无法将其删除,我想将其标记为逻辑删除。
这是我的代码:
@Transactional
public void removeEntity(EntityDto e) {
Entity entity = entityRepository.findOne(e.getId());
try {
entityRepository.delete(e.getId());
entityRepository.flush();
} catch (DataIntegrityViolationException ex) {
logger.debug("Logical removal");
entity.setLogicalRemovalDate(new Date());
entityRepository.save(entity);
}
}
调用save()方法后,我得到了这个异常:
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.ObjectDeletedException: deleted instance passed to merge
有什么办法可以实现这个功能吗?
感谢。
答案 0 :(得分:1)
使用全新的Hibernate会话,并非在新事务中执行此操作。 The documentation说:
如果Session抛出异常,包括任何SQLException, 立即回滚数据库事务,调用Session.close() 并丢弃Session实例。 Session的某些方法不会 使会话保持一致状态。没有例外 Hibernate可以被视为可恢复的。
在尝试删除实体之前,您应该检查是否没有其他实体引用要删除的实体。或者只是总是逻辑地删除它,因为它似乎是你为引用的实体做的。