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 に答える