nhibernate - 为什么 NHibernate 删除不可变类实例?

标签 nhibernate immutability

我正在尝试将应用程序从 NHibernate 1.x 迁移到 2.1,并且我注意到一些奇怪的事情:我的不可变对象(immutable对象)在我的集成测试中被删除。

例如,这个测试曾经通过:

[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));
}

对 CommitChanges 的调用应该抛出,因为尝试删除其类型映射为 mutable="false"的实例。但是,在更新预期的异常类型后,此测试现在失败(因为没有抛出异常)。我检查了数据库并通过测试进行了跟踪,创建了记录,加载了实例,然后再次删除了记录。

相关类与另一个类映射到同一个表 - 它或多或少是作为该数据子集的只读 View 。这是类映射:

<?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>

我希望我错过了一些基本的东西,但我一直在网上搜索可变属性可能被忽略的任何原因,但我一无所获。

更新:

使用 Log4Net 进行记录,很明显 NHibernate 正在向数据库发送删除命令。

最佳答案

深入研究后,我发现这段代码在 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 现在能够再次删除不可变类实例。不可变对象(immutable对象)应该是可删除的——事实上它们最初不是可删除的,这才是真正的错误。

关于nhibernate - 为什么 NHibernate 删除不可变类实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1525459/

相关文章:

nhibernate - 如何在NHibernate hbm.xml映射文件中映射VARCHAR(MAX)列

java - 由于不变性,字符串线程安全?

NHibernate - 改变子类型

oracle - 无法执行 native 批量操作查询

c# - 为什么这个结构是可变的?什么时候可以接受可变结构?

javascript - 使用不可变的js将reducer状态设置为返回的数组

javascript - 无法使过滤器与 Immer.js 一起使用以删除数组中的嵌套对象

F#:只为第一个事件做一个 Action ,没有可变性/锁定?

.net - 在同一个解决方案中引用2个不同版本的log4net

c# - Nhibernate 查询具有多个获取和多个条件