2

アプリをNHibernate1.xから2.1に移行しようとしていますが、奇妙なことに気づきました。統合テストで不変オブジェクトが削除されています。

たとえば、このテストは以前は合格していました。

[Test, ExpectedException(typeof(NHibernate.HibernateException))]
public void DeleteExistingInstanceThrows()
{
    // Note: NHib transaction is opened/rolled back in test setup/teardown
    m_testRecordId = CreateRecordInDB();
    var dao = new NHibFactory().GetTransDao();
    var obj = dao.GetById((long)m_testRecordId, false);

    dao.Delete(obj);
    dao.CommitChanges();

    Assert.IsFalse(TestRecordExists(m_testRecordId));
}

タイプがmutable="false"でマップされているインスタンスを削除しようとするため、CommitChangesの呼び出しがスローされます。ただし、予期される例外タイプを更新した後、このテストは失敗します(例外がスローされないため)。データベースをチェックしてテストをトレースしたところ、レコードが作成され、インスタンスが読み込まれ、その後、レコードが再び削除されます。

問題のクラスは、別のクラスと同じテーブルにマップされます。これは、多かれ少なかれ、そのデータのサブセットの読み取り専用ビューとして意図されています。クラスマッピングは次のとおりです。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="Sample.Trans, Sample" table="tblTrans" mutable="false">

        <id name="Id" column="transId" unsaved-value="0">
            <generator class="identity" />
        </id>

        <property name="Amount" column="amount" type="Decimal" />

        <!-- ...a half dozen other mapped fields... -->
    </class>
</hibernate-mapping>

基本的なものが欠けていると思いますが、可変属性が無視される可能性がある理由でWebを精査していて、空になっています。

アップデート:

Log4Netでログを記録すると、NHibernateがデータベースに削除コマンドを送信していたことは明らかです。

4

2 に答える 2

3

それを掘り下げた後、私はこのコードのブロックがDefaultDeleteEventListenerのOnDeleteメソッドでコメントアウトされているのを見つけました:

/*
if ( !persister.isMutable() ) {
throw new HibernateException(
"attempted to delete an object of immutable class: " +
MessageHelper.infoString(persister)
);
}*/

その結果、不変のインスタンスを削除しようとしても例外は発生せず、その後、インスタンスが変更可能であるかのように削除が実際に発生します。

私は自分の発見をNHibernateメンテナにメモを送りました-私にはバグのように見えます。

別の投稿者が指摘したように、この問題は2009年10月31日からのリリース2.1.1で修正されました。

アップデート:

2011年2月の時点で、NHibernateは不変のクラスインスタンスを再び削除できるようになりました。不変オブジェクトは削除可能である必要があります-それらが元々そうではなかったという事実は実際のバグでした。

于 2009-10-08T15:00:17.470 に答える
0

同じ状況でまったく同じ問題が発生しました(1.xからのアップグレード)。このバグは、10月31日にリリースされた2.1.1で修正されました。

/エミル

于 2009-11-09T08:09:54.137 に答える