【问题标题】:NHibernate Transaction fails with Insert and Update on OracleNHibernate 事务因 Oracle 上的插入和更新而失败
【发布时间】:2009-07-14 13:04:52
【问题描述】:

更新后:我已经通过命令“ExecuteNonQuery”找到了问题所在。那是在更新期间失败或在插入期间挂起的那个。尝试使用普通 ADO.NET 的简单示例,他们的事务完美运行。另外......它在我的本地家庭计算机连接上运行良好,Oracle Express 版本。在某种服务器配置中再次指向它? 在调试时进入 NHibernate 代码会很好,但到目前为止我仍然无法设置它,即使我已经重建了源代码并使用了那些 dll 和 pdb 文件。以前有人能做到吗?

我已经为此苦苦思索了一段时间。几天来,我一直在使用 NHibernate 和 Oracle 10g 数据库进行开发,到目前为止,我只使用了在映射方面都很好用的 select 语句。

我现在开始实现我的第一个插入(保存)和更新语句,但是测试都失败了。 它们都在 transaction.commit() 部分失败。

当执行 INSERT(保存)时,代码到达 transaction.commit(),但随后“卡住”了。测试继续运行,没有前进。 这是测试的输出(注意测试一直在运行)

NHibernate: select hibernate_sequence.nextval from dual
NHibernate: INSERT INTO MOB_PL_MAPPING_TEST (DES, TEST_ID) VALUES (:p0, :p1);:p0 = 'This is a test!', :p1 = 161

执行 UPDATE 时,transaction.commit() 失败,我收到以下错误堆栈:

NHibernate: SELECT test0_.TEST_ID as TEST1_10_0_, test0_.DES as DES10_0_ FROM MOB_PL_MAPPING_TEST test0_ WHERE test0_.TEST_ID=:p0;:p0 = 61
NHibernate: UPDATE MOB_PL_MAPPING_TEST SET DES = :p0 WHERE TEST_ID = :p1;:p0 = 'Changed!', :p1 = 61
TestCase 'Data.Tests.Test_Update_on_Test_Table'
failed: NHibernate.TransactionException : Rollback failed with SQL Exception
  ----> System.InvalidOperationException : This OracleTransaction has completed; it is no longer usable.
   c:\CSharp\NH\nhibernate\src\NHibernate\Transaction\AdoTransaction.cs(260,0): at NHibernate.Transaction.AdoTransaction.Rollback()
   E:\SubVersion\Application\Src\Data\UnitOfWork\Data.UnitOfWork\GenericTransaction.cs(26,0): at Data.UOW.GenericTransaction.Rollback()
   E:\SubVersion\Application\Src\Data\UnitOfWork\Data.UnitOfWork\UnitOfWorkImplementor.cs(49,0): at Data.UOW.UnitOfWorkImplementor.TransactionFlush(IsolationLevel isolationLevel)
   E:\SubVersion\Application\Src\Data\UnitOfWork\Data.UnitOfWork\UnitOfWorkImplementor.cs(36,0): at Data.UOW.UnitOfWorkImplementor.TransactionFlush()
   E:\SubVersion\Application\Src\Data\Data.Tests\Repositories\LoyaltyRepositoryTests.cs(159,0): at Data.Tests.Test_Update_on_Test_Table()
   --InvalidOperationException
   at System.Data.OracleClient.OracleTransaction.AssertNotCompleted()
   at System.Data.OracleClient.OracleTransaction.Rollback()
   c:\CSharp\NH\nhibernate\src\NHibernate\Transaction\AdoTransaction.cs(246,0): at NHibernate.Transaction.AdoTransaction.Rollback()

我必须说我对 oracle 不了解,但似乎建立事务会导致问题。尽管选择语句 (GET) 的相同代码(使用事务)工作正常。 这可能是一个 oracle 配置问题(阻止插入/更新事务)还是我必须在应用程序级别配置其他东西?

任何人都可以在这里帮助我或进一步了解可能发生的问题吗?

提前致谢。

【问题讨论】:

    标签: oracle nhibernate transactions insert


    【解决方案1】:

    在设法将 NHibernate 代码连接到我的调试器后,我能够单步执行代码直到执行 Command 对象的位置。 在那里,问题在于参数类型。字符串类型设置为“String”的参数,它们应该是“AnsiString”。

    原来,我在将字符串映射到 id 时已经遇到过这篇文章 http://www.jameskovacs.com/blog/NHibernateAndTheCaseOfTheCrappyOracleErrorMessage.aspx 但没想到更多。

    无论哪种方式,将类型添加到映射中的每个字符串属性都可以解决问题。

    <property name="Description" column="DES" type="AnsiString" />
    

    忙碌的 3 天......但它已经解决了:D

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多