2015-10-06 76 views
1

我是新来NHibernate和我写一些代码从使用NHibernate提取请求表中的记录总数,代码如下如下:NHibernate的抛出NHibernate.Exceptions.GenericADOException无法更新过程中获取请求

var query = request.RpcManager.Session.CreateCriteria(beanType); 
...... 
int totalRowCount = (int)query.UniqueResult<int>(); 

和细节异常消息就像是以下几点:

NHibernate.Exceptions.GenericADOException was unhandled by user code 
     HResult=-2146232832 
     Message=could not update: [TestApi.DAO.AD_Window#125][SQL: UPDATE AD_WINDOW SET AD_CLIENT_ID = ?, AD_ORG_ID = ?, ISACTIVE = ?, CREATED = ?, CREATEDBY = ?, UPDATED = ?, UPDATEDBY = ?, NAME = ?, DESCRIPTION = ?, HELP = ?, WINDOWTYPE = ?, ISSOTRX = ?, ENTITYTYPE = ?, PROCESSING = ?, AD_IMAGE_ID = ?, AD_COLOR_ID = ?, ISDEFAULT = ?, WINHEIGHT = ?, WINWIDTH = ?, ISBETAFUNCTIONALITY = ? WHERE AD_WINDOW_ID = ?] 
     Source=NHibernate 
     SqlString=UPDATE AD_WINDOW SET AD_CLIENT_ID = ?, AD_ORG_ID = ?, ISACTIVE = ?, CREATED = ?, CREATEDBY = ?, UPDATED = ?, UPDATEDBY = ?, NAME = ?, DESCRIPTION = ?, HELP = ?, WINDOWTYPE = ?, ISSOTRX = ?, ENTITYTYPE = ?, PROCESSING = ?, AD_IMAGE_ID = ?, AD_COLOR_ID = ?, ISDEFAULT = ?, WINHEIGHT = ?, WINWIDTH = ?, ISBETAFUNCTIONALITY = ? WHERE AD_WINDOW_ID = ? 
     StackTrace: 
      at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) 
      at NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) 
      at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session) 
      at NHibernate.Action.EntityUpdateAction.Execute() 
      at NHibernate.Engine.ActionQueue.Execute(IExecutable executable) 
      at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) 
      at NHibernate.Engine.ActionQueue.ExecuteActions() 
      at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) 
      at NHibernate.Event.Default.DefaultAutoFlushEventListener.OnAutoFlush(AutoFlushEvent event) 
      at NHibernate.Impl.SessionImpl.AutoFlushIfRequired(ISet`1 querySpaces) 
      at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) 
      at NHibernate.Impl.CriteriaImpl.List(IList results) 
      at NHibernate.Impl.CriteriaImpl.UniqueResult[T]() 
      ...... 
     InnerException: 
      Code=1407 
      ErrorCode=-2146232008 
      HResult=-2146232008 
      Message=ORA-01407: cannot update ("COMPIERE"."AD_WINDOW"."CREATED") to NULL 

      Source=System.Data.OracleClient 
      StackTrace: 
       at System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc) 
       at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals) 
       at System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal(Boolean needRowid, OciRowidDescriptor& rowidDescriptor) 
       at System.Data.OracleClient.OracleCommand.ExecuteNonQuery() 
       at NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand cmd) 
       at NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation expectation) 
       at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) 
      InnerException: 

我正在为获取请求,所以我不明白为什么例外是有关更新,请给我就如何解决这个问题的一些想法, 谢谢。

我试图用类似的代码:

request.RpcManager.Session.QueryOver<AD_Window>().RowCount(); 

但得到了同样的异常。

回答

1

您在第一级(会话)缓存中修改了(或至少NH认为它已被修改,搜索Google for ghosts)实体。在进行查询之前,NH将尝试冲洗每一次。 如果您将ISession上的FlushMode设置为Never,那么您可能会得到它,但真正的问题依然存在。

+0

由于获取请求是由一般请求完成的,所以它在一个事务中。通过取消交易它解决了问题。谢谢。 – mhan0125

相关问题