【问题标题】:Jpa save entity after failed delete删除失败后Jpa保存实体
【发布时间】:2012-11-20 06:08:04
【问题描述】:

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

这是我的代码:

  @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

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

谢谢。

【问题讨论】:

    标签: spring hibernate jpa transactions spring-data


    【解决方案1】:

    如果没有在新事务中使用新的 Hibernate 会话,则不会这样做。 The documentation 说:

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

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

    【讨论】:

    • 谢谢,通过创建 2 个事务方法修复,一个用于逻辑删除,一个用于物理删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多