/// <summary> /// If this is a collection initializer, we need to tell the session that a collection /// is being initilized, to account for the possibility of the collection having /// no elements (hence no rows in the result set). /// </summary> /// <param name="keys"></param> /// <param name="resultSetId"></param> /// <param name="session"></param> private void HandleEmptyCollections( object[ ] keys, object resultSetId, ISessionImplementor session ) { for( int i = 0; i < keys.Length; i++ ) { if( log.IsDebugEnabled ) { log.Debug( "result set contains (possibly empty) collection: " + MessageHelper.InfoString( CollectionPersister, keys[ i ] ) ); } session.GetLoadingCollection( CollectionPersister, keys[ i ], resultSetId ); } }
/// <summary> /// If this is a collection initializer, we need to tell the session that a collection /// is being initilized, to account for the possibility of the collection having /// no elements (hence no rows in the result set). /// </summary> internal void HandleEmptyCollections( object[] keys, object resultSetId, ISessionImplementor session ) { if (keys != null) { // this is a collection initializer, so we must create a collection // for each of the passed-in keys, to account for the possibility // that the collection is empty and has no rows in the result set ICollectionPersister[] collectionPersisters = CollectionPersisters; for (int j = 0; j < collectionPersisters.Length; j++) { for (int i = 0; i < keys.Length; i++) { // handle empty collections if (log.IsDebugEnabled) { log.Debug("result set contains (possibly empty) collection: " + MessageHelper.InfoString(collectionPersisters[j], keys[i])); } session.GetLoadingCollection(collectionPersisters[j], keys[i], resultSetId); } } } }
/// <summary> /// Read one collection element from the current row of the ADO.NET result set /// </summary> /// <param name="optionalOwner"></param> /// <param name="optionalKey"></param> /// <param name="rs"></param> /// <param name="session"></param> private void ReadCollectionElement( object optionalOwner, object optionalKey, IDataReader rs, ISessionImplementor session ) { ICollectionPersister collectionPersister = CollectionPersister; object collectionRowKey = collectionPersister.ReadKey( rs, session ); if( collectionRowKey != null ) { if( log.IsDebugEnabled ) { log.Debug( "found row of collection: " + MessageHelper.InfoString( collectionPersister, collectionRowKey ) ); } object owner = optionalOwner; if( owner == null ) { owner = session.GetCollectionOwner( collectionRowKey, collectionPersister ); if( owner == null ) { //TODO: This is assertion is disabled because there is a bug that means the // original owner of a transient, uninitialized collection is not known // if the collection is re-referenced by a different object associated // with the current Session //throw new AssertionFailure("bug loading unowned collection"); } } PersistentCollection rowCollection = session.GetLoadingCollection( collectionPersister, collectionRowKey, rs ); if( rowCollection != null ) { rowCollection.ReadFrom( rs, collectionPersister, owner ); } } else if( optionalKey != null ) { if( log.IsDebugEnabled ) { log.Debug( "result set contains (possibly empty) collection: " + MessageHelper.InfoString( collectionPersister, optionalKey ) ); } session.GetLoadingCollection( collectionPersister, optionalKey, rs ); // handle empty collection } }
/// <summary> /// Read one collection element from the current row of the ADO.NET result set /// </summary> private void ReadCollectionElement( object optionalOwner, object optionalKey, ICollectionPersister persister, ICollectionAliases descriptor, IDataReader rs, ISessionImplementor session ) { object collectionRowKey = persister.ReadKey( rs, descriptor.SuffixedKeyAliases, session); if (collectionRowKey != null) { // we found a collection element in the result set if (log.IsDebugEnabled) { log.Debug( "found row of collection: " + MessageHelper.InfoString(persister, collectionRowKey)); } object owner = optionalOwner; if (owner == null) { owner = session.GetCollectionOwner(collectionRowKey, persister); if (owner == null) { //TODO: This is assertion is disabled because there is a bug that means the // original owner of a transient, uninitialized collection is not known // if the collection is re-referenced by a different object associated // with the current Session //throw new AssertionFailure("bug loading unowned collection"); } } IPersistentCollection rowCollection = session.GetLoadingCollection(persister, collectionRowKey, rs); if (rowCollection != null) { rowCollection.ReadFrom(rs, persister, descriptor, owner); } } else if (optionalKey != null) { // we did not find a collection element in the result set, so we // ensure that a collection is created with the owner's identifier, // since what we have is an empty collection if (log.IsDebugEnabled) { log.Debug( "result set contains (possibly empty) collection: " + MessageHelper.InfoString(persister, optionalKey)); } session.GetLoadingCollection(persister, optionalKey, rs); // handle empty collection } // else no collection element, but also no owner }