2


データベースに存在しないエンティティを削除しようとしていますが、delete()メソッドで例外が発生しません。
存在しないエンティティを削除しようとすると、どうすればエラーが発生しますか?
以下にコードをコピーしました。

public void remove(MyEntity persistentInstance) {
 logger.debug("removing entity: " + persistentInstance);
    try {
        sessionFactory.getCurrentSession().delete(persistentInstance);
        logger.debug("remove successful");
    } catch (final RuntimeException re) {
        logger.error("remove failed", re);
        throw re;
    }
}

編集:
次のコードを使用して、テストでremoveを呼び出します。

final MyEntity instance2 = new MyEntity (Utilities.maxid + 1); //non existent id
    try {
        mydao.remove(instance2);
        sessionFactory.getCurrentSession().flush();
        fail(removeFailed);
    } catch (final RuntimeException ex) {

    }

フラッシュと呼んでもテストは失敗しません、なぜですか?
例外を取得したいのですが。とにかく、delete()がいつ例外をスローできるかを理解することにも興味があります。

4

1 に答える 1

1

あなたが見つけている問題は、あなたが削除しようとしているオブジェクトの状態に関連していると思います。hibernateで使用される主な状態は、一時的、永続的、および分離の3つです。

一時インスタンスは、永続化されたことのないまったく新しいインスタンスです。永続化すると、永続化されます。接続が閉じられ、オブジェクトが永続化された後、オブジェクトは切り離されます。ドキュメントでは、 https: //docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/objectstate.html#objectstate-overviewについて詳しく説明しています。

次に例を示します。

MyEntity foo = new MyEntity(); // foo is a transient instance
sessionFactory.getCurrentSession.persist(foo); // foo is now a persisted instance
txn.commit(); // foo is now a detatched instance

この例では、未使用のIDを使用して新しいインスタンスを作成していますが、インスタンスは一時的です(永続化されることはありません)。一時的なインスタンスに対してdeleteを呼び出すと、Hibernateは無視していると思います。Deleteは、データストアから永続インスタンスを削除することを示します。https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html#delete(java.lang.Object)

代わりに、次のようなものを試してください。

public void remove(long entityId) {
    MyEntity myEntity = myEntityDAO.findById(entityId);
    if (myEntity == null) {
        // error logic here
    } else {
        sessionFactory.getCurrentSession().delete(myEntity);
    }
}
于 2014-07-16T19:17:11.487 に答える