0

トランザクション全体で、単純な作成/削除を機能させることができません。私はSpring/JPA/Hibernateを使用していますが、ehcacheは使用していません。

私のエンティティ クラス User と、Spring の @Transactional でマークされた 2 つのメソッドを持つ MyDao (@Transactional がサービスを提供する必要があることは理解しています。ここでは、私のケースを単純化しています)

    パブリッククラス MyDao {
      @PersistenceContext
      プライベート EntityManager entityManager;

      @トランザクション
      public void create(ユーザー ユーザー) {
        entityManager.persist(ユーザー);
        entityManager.refresh(ユーザー);
      }

      @トランザクション
      public void delete(ユーザー ユーザー) {
        // ユーザーが切り離されている可能性があるため、Hibernate を使用して削除します。
        セッション sess = entityManager.unwrap(Session.class);
        sess.delete(ユーザー);
      }
    }

私のテスト:

    {
      ユーザー user = new User();
      myDao.create(ユーザー);

      // 上記は問題ありません。生成された ID で作成されたユーザー。
      // トランザクションがクローズされていると想定しているため、ユーザーは切り離されています

      myDao.delete(ユーザー);

      // 上記はエラー「デタッチされたインスタンスを削除しています ...」で失敗しました
    }

Hibernate によると、session.delete() はデタッチまたはマネージドのいずれかを削除できます。しかし、なぜ失敗したのでしょうか。

手伝ってくれてありがとう

マイケル

4

1 に答える 1

0

Hibernate のドキュメントでは、equals() と hashCode() をオーバーライドする場合にのみ、デタッチされたエンティティを操作できると述べています。明日から仕事に戻ったときに、うまくいくかどうかを確認します。私が満足していない2つのこと:

  • 以前に切り離された場合、エンティティには ID フィールドの値が必要です。それを使用しないのはなぜですか?
  • ドキュメント...

私たちの db テーブルには ID 列に長い文字列が含まれているため、抽象 getId() で基本エンティティ クラスを使用することはできません。エンティティクラスからのリフレクションを介して @Id フィールドを取得するメソッドを実装し、次に純粋な JPA で最初に find() を実行してから削除する方法を実装するところまで進みました。

ところで、私は 1 つの User クラスだけでなく、すべてのエンティティに適用されるジェネリック メソッドについて話しています。

于 2012-08-30T04:41:59.063 に答える