代码之家  ›  专栏  ›  技术社区  ›  Remi Despres-Smyth

为什么nhibernate会删除不可变的类实例?

  •  2
  • Remi Despres-Smyth  · 技术社区  · 16 年前

    我正在尝试将一个应用程序从nhibernate 1.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));
    }
    

    对commitchanges的调用应引发,因为尝试删除类型映射为mutable=“false”的实例。但是,在更新预期的异常类型之后,此测试现在失败(因为没有引发异常)。我已经检查了数据库并通过测试进行了跟踪,并且创建了记录,加载了实例,然后记录又被删除了。

    所讨论的类与另一个类映射到同一个表-它或多或少是作为该数据子集的只读视图。这是类映射:

    <?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正在向数据库发送删除命令。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Remi Despres-Smyth    15 年前

    在深入研究之后,我发现了在DefaultDeleteEventListener的OnDelete方法中注释掉的这段代码:

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

    因此,在尝试删除不可变的实例时不会引发异常,并且在之后确实会发生删除,就好像实例是可变的一样。

    我已经把我的发现发给了一个NHibernate维护人员——对我来说,这看起来像一个bug。

    另一张海报指出,该问题在2009年10月31日的2.1.1版中得到了修复。

    更新:

    截至2011年2月,nhibernate现在能够再次删除不可变的类实例。不可变的对象应该是可删除的——事实上它们最初不是真正的bug。

        2
  •  0
  •   Emil Åström    16 年前

    在相同的情况下(从1.x升级),我遇到了完全相同的问题。该漏洞已在10月31日发布的2.1.1中修复。

    埃米尔