|
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.
|