NHibernate
  1. NHibernate
  2. NH-2740

QueryOver does not work with 2nd level cache if entity contains lazy properties

    Details

      Description

      QueryOver<> queries do not work for entities with lazy properties if second-level cache is turned on.

      Running such query results in Exception

      Entity:

      Serializable
      public class UserRole
      {
      public virtual int Id

      { get; set; }

      public virtual string Name

      { get;set; }

      }

      Mapping:
      <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="KudaNado.Core.Entities" assembly="KudaNado.Core"
      schema="dbo" default-cascade="save-update">
      <class name="UserRole" table="UserRole">
      <cache usage="nonstrict-read-write" region="LongTerm" />
      <id name="Id" column="ID">
      <generator class="native" />
      </id>
      <property name="Name" length="50" not-null="true" lazy="true"/>
      </class>
      </hibernate-mapping>

      Query:

      var roles = session.QueryOver<UserRole>().Take(2).List();

      ADO.NET Provider: MS SQL "))*
      .NET Version: 4.0

      10:07:46,175 TestRunnerThread DEBUG NHibernate.Impl.SessionImpl - session-id=3e29ff04-f9e6-4498-b95c-2783ce545b9a opened session at timestamp: 5350678798987264, for session factory: /9cd392140f24407d9243cc6bd4c7693b
      10:07:46,178 TestRunnerThread INFO KudaNado.Integration.Tests.MappingIntegrationTests - Execute query
      10:07:46,210 TestRunnerThread DEBUG NHibernate.Loader.Criteria.CriteriaQueryTranslator - put criteria= alias=this0_
      10:07:46,242 TestRunnerThread DEBUG NHibernate.AdoNet.AbstractBatcher - Opened new IDbCommand, open IDbCommands: 1
      10:07:46,242 TestRunnerThread DEBUG NHibernate.AdoNet.AbstractBatcher - Building an IDbCommand object for the SqlString: SELECT TOP this_.ID as ID12_0_ FROM dbo.UserRole this_
      10:07:46,245 TestRunnerThread INFO NHibernate.Loader.Loader - SELECT TOP (@p0) this_.ID as ID12_0_ FROM dbo.UserRole this_
      10:07:46,249 TestRunnerThread DEBUG NHibernate.SQL - SELECT TOP (@p0) this_.ID as ID12_0_ FROM dbo.UserRole this_;@p0 = 2 Type: Int32 (0)
      10:07:46,251 TestRunnerThread DEBUG NHibernate.Connection.DriverConnectionProvider - Obtaining IDbConnection from Driver
      10:07:46,252 TestRunnerThread DEBUG NHibernate.AdoNet.AbstractBatcher - ExecuteReader took 0 ms
      10:07:46,253 TestRunnerThread DEBUG NHibernate.AdoNet.AbstractBatcher - Opened IDataReader, open IDataReaders: 1
      10:07:46,254 TestRunnerThread DEBUG NHibernate.Loader.Loader - processing result set
      10:07:46,254 TestRunnerThread DEBUG NHibernate.Loader.Loader - result set row: 0
      10:07:46,256 TestRunnerThread DEBUG NHibernate.Type.Int32Type - returning '1' as column: ID12_0_
      10:07:46,259 TestRunnerThread DEBUG NHibernate.Loader.Loader - result row: EntityKeyKudaNado.Core.Entities.UserRole#1
      10:07:46,263 TestRunnerThread DEBUG NHibernate.Driver.NHybridDataReader - running NHybridDataReader.Dispose()
      10:07:46,263 TestRunnerThread DEBUG NHibernate.AdoNet.AbstractBatcher - Closed IDataReader, open IDataReaders :0
      10:07:46,263 TestRunnerThread DEBUG NHibernate.AdoNet.AbstractBatcher - DataReader was closed after 11 ms
      10:07:46,264 TestRunnerThread DEBUG NHibernate.AdoNet.AbstractBatcher - Closed IDbCommand, open IDbCommands: 0
      10:07:46,266 TestRunnerThread DEBUG NHibernate.Util.ADOExceptionReporter - could not execute query
      [ SELECT TOP (@p0) this_.ID as ID12_0_ FROM dbo.UserRole this_ ]

      System.NotSupportedException: Specified method is not supported.
      at NHibernate.Proxy.AbstractProxyFactory.GetFieldInterceptionProxy(Object instanceToWrap)
      at NHibernate.Tuple.PocoInstantiator.Instantiate()
      at NHibernate.Tuple.PocoInstantiator.Instantiate(Object id)
      at NHibernate.Tuple.Entity.AbstractEntityTuplizer.Instantiate(Object id)
      at NHibernate.Persister.Entity.AbstractEntityPersister.Instantiate(Object id, EntityMode entityMode)
      at NHibernate.Impl.SessionImpl.Instantiate(IEntityPersister persister, Object id)
      at NHibernate.Impl.SessionImpl.Instantiate(String clazz, Object id)
      at NHibernate.Loader.Loader.InstanceNotYetLoaded(IDataReader dr, Int32 i, ILoadable persister, EntityKey key, LockMode lockMode, String rowIdAlias, EntityKey optionalObjectKey, Object optionalObject, IList hydratedObjects, ISessionImplementor session)
      at NHibernate.Loader.Loader.GetRow(IDataReader rs, ILoadable[] persisters, EntityKey[] keys, Object optionalObject, EntityKey optionalObjectKey, LockMode[] lockModes, IList hydratedObjects, ISessionImplementor session)
      at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies)
      at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
      at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
      at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
      10:07:46,268 TestRunnerThread WARN NHibernate.Util.ADOExceptionReporter - System.NotSupportedException: Specified method is not supported.
      at NHibernate.Proxy.AbstractProxyFactory.GetFieldInterceptionProxy(Object instanceToWrap)
      at NHibernate.Tuple.PocoInstantiator.Instantiate()
      at NHibernate.Tuple.PocoInstantiator.Instantiate(Object id)
      at NHibernate.Tuple.Entity.AbstractEntityTuplizer.Instantiate(Object id)
      at NHibernate.Persister.Entity.AbstractEntityPersister.Instantiate(Object id, EntityMode entityMode)
      at NHibernate.Impl.SessionImpl.Instantiate(IEntityPersister persister, Object id)
      at NHibernate.Impl.SessionImpl.Instantiate(String clazz, Object id)
      at NHibernate.Loader.Loader.InstanceNotYetLoaded(IDataReader dr, Int32 i, ILoadable persister, EntityKey key, LockMode lockMode, String rowIdAlias, EntityKey optionalObjectKey, Object optionalObject, IList hydratedObjects, ISessionImplementor session)
      at NHibernate.Loader.Loader.GetRow(IDataReader rs, ILoadable[] persisters, EntityKey[] keys, Object optionalObject, EntityKey optionalObjectKey, LockMode[] lockModes, IList hydratedObjects, ISessionImplementor session)
      at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies)
      at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
      at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
      at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
      10:07:46,268 TestRunnerThread ERROR NHibernate.Util.ADOExceptionReporter - Specified method is not supported.
      10:07:46,269 TestRunnerThread DEBUG NHibernate.Util.ADOExceptionReporter - could not execute query
      [ SELECT TOP (@p0) this_.ID as ID12_0_ FROM dbo.UserRole this_ ]

      [ SELECT TOP (@p0) this_.ID as ID12_0_ FROM dbo.UserRole this_ ]

      System.NotSupportedException: Specified method is not supported.
      at NHibernate.Proxy.AbstractProxyFactory.GetFieldInterceptionProxy(Object instanceToWrap)
      at NHibernate.Tuple.PocoInstantiator.Instantiate()
      at NHibernate.Tuple.PocoInstantiator.Instantiate(Object id)
      at NHibernate.Tuple.Entity.AbstractEntityTuplizer.Instantiate(Object id)
      at NHibernate.Persister.Entity.AbstractEntityPersister.Instantiate(Object id, EntityMode entityMode)
      at NHibernate.Impl.SessionImpl.Instantiate(IEntityPersister persister, Object id)
      at NHibernate.Impl.SessionImpl.Instantiate(String clazz, Object id)
      at NHibernate.Loader.Loader.InstanceNotYetLoaded(IDataReader dr, Int32 i, ILoadable persister, EntityKey key, LockMode lockMode, String rowIdAlias, EntityKey optionalObjectKey, Object optionalObject, IList hydratedObjects, ISessionImplementor session)
      at NHibernate.Loader.Loader.GetRow(IDataReader rs, ILoadable[] persisters, EntityKey[] keys, Object optionalObject, EntityKey optionalObjectKey, LockMode[] lockModes, IList hydratedObjects, ISessionImplementor session)
      at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies)
      at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
      at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
      at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
      10:07:46,269 TestRunnerThread WARN NHibernate.Util.ADOExceptionReporter - System.NotSupportedException: Specified method is not supported.
      at NHibernate.Proxy.AbstractProxyFactory.GetFieldInterceptionProxy(Object instanceToWrap)
      at NHibernate.Tuple.PocoInstantiator.Instantiate()
      at NHibernate.Tuple.PocoInstantiator.Instantiate(Object id)
      at NHibernate.Tuple.Entity.AbstractEntityTuplizer.Instantiate(Object id)
      at NHibernate.Persister.Entity.AbstractEntityPersister.Instantiate(Object id, EntityMode entityMode)
      at NHibernate.Impl.SessionImpl.Instantiate(IEntityPersister persister, Object id)
      at NHibernate.Impl.SessionImpl.Instantiate(String clazz, Object id)
      at NHibernate.Loader.Loader.InstanceNotYetLoaded(IDataReader dr, Int32 i, ILoadable persister, EntityKey key, LockMode lockMode, String rowIdAlias, EntityKey optionalObjectKey, Object optionalObject, IList hydratedObjects, ISessionImplementor session)
      at NHibernate.Loader.Loader.GetRow(IDataReader rs, ILoadable[] persisters, EntityKey[] keys, Object optionalObject, EntityKey optionalObjectKey, LockMode[] lockModes, IList hydratedObjects, ISessionImplementor session)
      at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies)
      at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
      at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
      at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
      10:07:46,269 TestRunnerThread ERROR NHibernate.Util.ADOExceptionReporter - Specified method is not supported.
      10:07:46,270 TestRunnerThread DEBUG NHibernate.AdoNet.ConnectionManager - after autocommit
      10:07:46,271 TestRunnerThread DEBUG NHibernate.Impl.SessionImpl - transaction completion
      10:07:46,271 TestRunnerThread DEBUG NHibernate.AdoNet.ConnectionManager - transaction completed on session with on_close connection release mode; be sure to close the session to release ADO.Net resources!
      10:07:46,280 TestRunnerThread DEBUG NHibernate.Impl.SessionImpl - closing session
      10:07:46,280 TestRunnerThread DEBUG NHibernate.AdoNet.AbstractBatcher - running BatcherImpl.Dispose(true)
      10:07:46,282 TestRunnerThread DEBUG NHibernate.Connection.ConnectionProvider - Closing connection
      10:07:46,282 TestRunnerThread DEBUG NHibernate.Impl.SessionImpl - transaction completion
      10:07:46,282 TestRunnerThread DEBUG NHibernate.AdoNet.ConnectionManager - transaction completed on session with on_close connection release mode; be sure to close the session to release ADO.Net resources!
      10:07:46,284 TestRunnerThread DEBUG NHibernate.Impl.SessionImpl - session-id=3e29ff04-f9e6-4498-b95c-2783ce545b9a running ISession.Dispose()
      10:07:46,284 TestRunnerThread DEBUG NHibernate.Impl.SessionImpl - session-id=3e29ff04-f9e6-4498-b95c-2783ce545b9a executing real Dispose(True)

        Activity

        Hide
        Vitaliy Kryvosheiev added a comment -

        Update:

        Looks like it is not working event if 2nd level cache is off.

        NHibernate version: 3.2.0.2001

        Show
        Vitaliy Kryvosheiev added a comment - Update: Looks like it is not working event if 2nd level cache is off. NHibernate version: 3.2.0.2001
        Hide
        Alexander I. Zaytsev added a comment -

        Does it work in 3.3.x or master? If not please provide a test case

        Show
        Alexander I. Zaytsev added a comment - Does it work in 3.3.x or master? If not please provide a test case
        Hide
        Jindrich Babica added a comment -

        Try this solution for the issue: https://groups.google.com/forum/#!msg/nhusers/pPnoPjd1nCY/WZMKxKP0tqUJ
        It helped me. As same as Vitaliy I was also using Bytecode Castle proxy generator. Removing it from my configuration solved the issue. NHibernate will use its own default generator in such case.

        Show
        Jindrich Babica added a comment - Try this solution for the issue: https://groups.google.com/forum/#!msg/nhusers/pPnoPjd1nCY/WZMKxKP0tqUJ It helped me. As same as Vitaliy I was also using Bytecode Castle proxy generator. Removing it from my configuration solved the issue. NHibernate will use its own default generator in such case.

          People

          • Assignee:
            Unassigned
            Reporter:
            Vitaliy Kryvosheiev
          • Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

            • Created:
              Updated:

              Who's Looking?