0

我正在尝试删除一个实体,如果由于约束而无法删除它,我想将其标记为逻辑删除。

这是我的代码:

  @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

有什么办法可以实现这个功能吗?

谢谢。

4

1 回答 1

1

并非没有在新事务中使用新的 Hibernate 会话来执行此操作。文档说:

如果 Session 抛出异常,包括任何 SQLException,立即回滚数据库事务,调用 Session.close() 并丢弃 Session 实例。Session 的某些方法不会使会话保持一致状态。Hibernate 抛出的任何异常都不能被视为可恢复的。

在尝试删除实体之前,您可能应该检查是否没有其他实体引用要删除的实体。或者干脆总是在逻辑上删除它,因为这似乎是你为引用的实体所做的事情。

于 2012-12-02T22:15:17.110 回答