删除失败后,Jpa保存实体

时间:2012-12-02 17:52:20

标签: spring hibernate jpa transactions spring-data

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

这是我的代码:

  @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

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

感谢。

1 个答案:

答案 0 :(得分:1)

使用全新的Hibernate会话,并非在新事务中执行此操作。 The documentation说:

  

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

在尝试删除实体之前,您应该检查是否没有其他实体引用要删除的实体。或者只是总是逻辑地删除它,因为它似乎是你为引用的实体做的。