From: <fab...@us...> - 2011-03-25 21:44:34
|
Revision: 5535 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5535&view=rev Author: fabiomaulo Date: 2011-03-25 21:44:28 +0000 (Fri, 25 Mar 2011) Log Message: ----------- Reverted previous partial fix and fixed NH-2488 completely (added joined-subclass case) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Persister/Entity/SingleTableEntityPersister.cs trunk/nhibernate/src/NHibernate/Tuple/Entity/PocoEntityTuplizer.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Model.cs Modified: trunk/nhibernate/src/NHibernate/Persister/Entity/SingleTableEntityPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Entity/SingleTableEntityPersister.cs 2011-03-25 20:29:34 UTC (rev 5534) +++ trunk/nhibernate/src/NHibernate/Persister/Entity/SingleTableEntityPersister.cs 2011-03-25 21:44:28 UTC (rev 5535) @@ -138,13 +138,8 @@ ?? ExecuteUpdateResultCheckStyle.DetermineDefault(customSQLDelete[j], deleteCallable[j]); - IEnumerable<Column> enumerableKeyCol = new SafetyEnumerable<Column>(join.Key.ColumnIterator); - List<string> kcName = new List<string>(join.Key.ColumnSpan); - foreach (Column col in enumerableKeyCol) - kcName.Add(col.GetQuotedName(factory.Dialect)); + keyColumnNames[j] = join.Key.ColumnIterator.OfType<Column>().Select(col => col.GetQuotedName(factory.Dialect)).ToArray(); - keyColumnNames[j] = kcName.ToArray(); - j++; } @@ -156,7 +151,7 @@ constraintOrderedKeyColumnNames[position] = keyColumnNames[i]; } - spaces = ArrayHelper.Join(qualifiedTableNames, ArrayHelper.ToStringArray(persistentClass.SynchronizedTables)); + spaces = qualifiedTableNames.Concat(persistentClass.SynchronizedTables).ToArray(); bool lazyAvailable = IsInstrumented(EntityMode.Poco); @@ -185,12 +180,9 @@ if (join.IsSequentialSelect && !persistentClass.IsClassOrSuperclassJoin(join)) hasDeferred = true; subclassTables.Add(join.Table.GetQualifiedName(factory.Dialect, factory.Settings.DefaultCatalogName, factory.Settings.DefaultSchemaName)); - IEnumerable<Column> enumerableKeyCol = new SafetyEnumerable<Column>(join.Key.ColumnIterator); - List<string> keyCols = new List<string>(join.Key.ColumnSpan); - foreach (Column col in enumerableKeyCol) - keyCols.Add(col.GetQuotedName(factory.Dialect)); - joinKeyColumns.Add(keyCols.ToArray()); + var keyCols = join.Key.ColumnIterator.OfType<Column>().Select(col => col.GetQuotedName(factory.Dialect)).ToArray(); + joinKeyColumns.Add(keyCols); } subclassTableSequentialSelect = isDeferreds.ToArray(); @@ -297,7 +289,6 @@ int join = persistentClass.GetJoinNumber(prop); propertyJoinNumbers.Add(join); - //propertyTableNumbersByName.put( prop.getName(), join ); propertyTableNumbersByNameAndSubclass[prop.PersistentClass.EntityName + '.' + prop.Name] = join; foreach (ISelectable thing in prop.ColumnIterator) { @@ -643,11 +634,10 @@ var tableNumbers = new HashSet<int>(); string[] props = subclassPersister.PropertyNames; string[] classes = subclassPersister.PropertySubclassNames; - bool[] propertyLazies = subclassPersister.PropertyLaziness; for (int i = 0; i < props.Length; i++) { int propTableNumber = GetSubclassPropertyTableNumber(props[i], classes[i]); - if (IsSubclassTableSequentialSelect(propTableNumber) && !IsSubclassTableLazy(propTableNumber) && propertyLazies[i] == false) + if (IsSubclassTableSequentialSelect(propTableNumber) && !IsSubclassTableLazy(propTableNumber)) { tableNumbers.Add(propTableNumber); } @@ -658,10 +648,9 @@ //figure out which columns are needed (excludes lazy-properties) List<int> columnNumbers = new List<int>(); int[] columnTableNumbers = SubclassColumnTableNumberClosure; - bool[] subclassColumnLaziness = SubclassColumnLaziness; for (int i = 0; i < SubclassColumnClosure.Length; i++) { - if (tableNumbers.Contains(columnTableNumbers[i]) && !subclassColumnLaziness[i]) + if (tableNumbers.Contains(columnTableNumbers[i])) { columnNumbers.Add(i); } @@ -670,10 +659,9 @@ //figure out which formulas are needed (excludes lazy-properties) List<int> formulaNumbers = new List<int>(); int[] formulaTableNumbers = SubclassColumnTableNumberClosure; - bool[] subclassFormulaLaziness = SubclassFormulaLaziness; for (int i = 0; i < SubclassFormulaTemplateClosure.Length; i++) { - if (tableNumbers.Contains(formulaTableNumbers[i]) && !subclassFormulaLaziness[i]) + if (tableNumbers.Contains(formulaTableNumbers[i])) { formulaNumbers.Add(i); } Modified: trunk/nhibernate/src/NHibernate/Tuple/Entity/PocoEntityTuplizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Tuple/Entity/PocoEntityTuplizer.cs 2011-03-25 20:29:34 UTC (rev 5534) +++ trunk/nhibernate/src/NHibernate/Tuple/Entity/PocoEntityTuplizer.cs 2011-03-25 21:44:28 UTC (rev 5535) @@ -78,9 +78,11 @@ public override bool IsInstrumented { get - { - return (EntityMetamodel.HasLazyProperties || EntityMetamodel.HasUnwrapProxyForProperties) - && FieldInterceptionHelper.IsInstrumented(MappedClass); + { + // NH: we can't really check for EntityMetamodel.HasLazyProperties and/or EntityMetamodel.HasUnwrapProxyForProperties here + // because this property is used even where subclasses has lazy-properties. + // Checking it here, where the root-entity has no lazy properties we will eager-load/double-load those properties. + return FieldInterceptionHelper.IsInstrumented(MappedClass); } } @@ -224,7 +226,7 @@ public override void AfterInitialize(object entity, bool lazyPropertiesAreUnfetched, ISessionImplementor session) { - if (IsInstrumented) + if (IsInstrumented && (EntityMetamodel.HasLazyProperties || EntityMetamodel.HasUnwrapProxyForProperties)) { HashedSet<string> lazyProps = lazyPropertiesAreUnfetched && EntityMetamodel.HasLazyProperties ? lazyPropertyNames : null; //TODO: if we support multiple fetch groups, we would need Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Fixture.cs 2011-03-25 20:29:34 UTC (rev 5534) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Fixture.cs 2011-03-25 21:44:28 UTC (rev 5535) @@ -77,10 +77,44 @@ } } } + private class JoinedSubclassScenario : IDisposable + { + private readonly ISessionFactory factory; + public JoinedSubclassScenario(ISessionFactory factory) + { + this.factory = factory; + using (ISession s = factory.OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + var entity = new Derived3 + { + ShortContent = "Short", + LongContent = "LongLongLongLongLong", + }; + s.Save(entity); + t.Commit(); + } + } + } + + public void Dispose() + { + using (ISession s = factory.OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + s.Delete("from Derived3"); + t.Commit(); + } + } + } + } + #endregion - [Test, Ignore("Not fixed yet")] + [Test] public void ShouldNotQueryLazyProperties_FetchJoin() { using (new FetchJoinScenario(Sfi)) @@ -108,9 +142,6 @@ [Test] public void ShouldNotQueryLazyProperties_FetchSelect() { - // this is the real meat of the test - // for most edifying results, run this with show_sql enabled - using (new FetchSelectScenario(Sfi)) { using (ISession s = OpenSession()) @@ -132,5 +163,30 @@ } } } + + [Test] + public void ShouldNotQueryLazyProperties_Joinedsubclass() + { + using (new JoinedSubclassScenario(Sfi)) + { + using (ISession s = OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + IList<Base3> items; + using (var ls = new SqlLogSpy()) + { + items = s.CreateQuery("from Base3").List<Base3>(); + ls.GetWholeLog().Should().Not.Contain("LongContent"); + } + var item = (Derived3)items[0]; + NHibernateUtil.IsPropertyInitialized(item, "LongContent").Should().Be.False(); + string lc = item.LongContent; + lc.Should().Not.Be.NullOrEmpty(); + NHibernateUtil.IsPropertyInitialized(item, "LongContent").Should().Be.True(); + } + } + } + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Mappings.hbm.xml 2011-03-25 20:29:34 UTC (rev 5534) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Mappings.hbm.xml 2011-03-25 21:44:28 UTC (rev 5535) @@ -29,4 +29,16 @@ <property name="LongContent" lazy="true" not-null="true" /> </join> </subclass> + + <class name="Base3" abstract="true"> + <id name="Id"> + <generator class="increment"/> + </id> + <property name="ShortContent"/> + </class> + <joined-subclass name="Derived3" extends="Base3"> + <key column="Id" /> + <property name="LongContent" lazy="true" not-null="true" /> + </joined-subclass> + </hibernate-mapping> \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Model.cs 2011-03-25 20:29:34 UTC (rev 5534) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2488/Model.cs 2011-03-25 21:44:28 UTC (rev 5535) @@ -23,4 +23,15 @@ { public virtual string LongContent { get; set; } } + + public class Base3 + { + public virtual int Id { get; set; } + + public virtual string ShortContent { get; set; } + } + public class Derived3 : Base3 + { + public virtual string LongContent { get; set; } + } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |