|
From: <fab...@us...> - 2011-04-23 18:51:43
|
Revision: 5751
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5751&view=rev
Author: fabiomaulo
Date: 2011-04-23 18:51:34 +0000 (Sat, 23 Apr 2011)
Log Message:
-----------
- Fix NH-2669 (patch completed, and test fixed) thanks to Rory Plaire to port the Hb fix
- Fix NH-2670
- Fix ByCode (subclass registration and TypeNameUtil)
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs
trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs
trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
trunk/nhibernate/src/NHibernate.Test/Stateless/Naturalness.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessWithRelationsFixture.cs
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeNameUtilTests.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.hbm.xml
trunk/nhibernate/src/NHibernate.Test/Stateless/Country.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/
trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Mappings.hbm.xml
trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Resource.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/StatelessSessionFetchingTest.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Task.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/User.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/
trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/LazyCollectionFetchTests.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/Org.cs
trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs
Modified: trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -393,5 +393,8 @@
bool IsReadOnly(object entityOrProxy);
void ReplaceDelayedEntityIdentityInsertKeys(EntityKey oldKey, object generatedId);
+
+ /// <summary>Is in a two-phase load? </summary>
+ bool IsLoadFinished { get; }
}
}
Modified: trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -1205,6 +1205,14 @@
oldEntry.LoadedWithLazyPropertiesUnfetched);
}
+ public bool IsLoadFinished
+ {
+ get
+ {
+ return loadCounter == 0;
+ }
+ }
+
#endregion
public override string ToString()
Modified: trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -53,7 +53,15 @@
public override void InitializeCollection(IPersistentCollection collection, bool writing)
{
- throw new SessionException("collections cannot be fetched by a stateless session");
+ if(temporaryPersistenceContext.IsLoadFinished)
+ {
+ throw new SessionException("Collections cannot be fetched by a stateless session. You can eager load it through specific query.");
+ }
+ CollectionEntry ce = temporaryPersistenceContext.GetCollectionEntry(collection);
+ if (!collection.WasInitialized)
+ {
+ ce.LoadedPersister.Initialize(ce.LoadedKey, this);
+ }
}
public override object InternalLoad(string entityName, object id, bool eager, bool isNullable)
@@ -733,7 +741,10 @@
{
CheckAndUpdateSessionStatus();
object result = Factory.GetEntityPersister(entityName).Load(id, null, lockMode, this);
- temporaryPersistenceContext.Clear();
+ if (temporaryPersistenceContext.IsLoadFinished)
+ {
+ temporaryPersistenceContext.Clear();
+ }
return result;
}
}
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -15,6 +15,9 @@
throw new ArgumentNullException("explicitDeclarationsHolder");
}
explicitDeclarationsHolder.AddAsTablePerClassEntity(typeof (TEntity));
+ // Add an empty customizer as a way to register the class as explicity declared
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinedSubclassAttributesMapper m) => { });
+
keyMapper = new JoinedSubclassKeyCustomizer<TEntity>(customizersHolder);
}
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -16,6 +16,9 @@
throw new ArgumentNullException("explicitDeclarationsHolder");
}
explicitDeclarationsHolder.AddAsTablePerClassHierarchyEntity(typeof (TEntity));
+
+ // Add an empty customizer as a way to register the class as explicity declared
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (ISubclassMapper m) => { });
}
#region ISubclassMapper<TEntity> Members
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -13,6 +13,9 @@
throw new ArgumentNullException("explicitDeclarationsHolder");
}
explicitDeclarationsHolder.AddAsTablePerConcreteClassEntity(typeof (TEntity));
+
+ // Add an empty customizer as a way to register the class as explicity declared
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IUnionSubclassAttributesMapper m) => { });
}
#region Implementation of IEntityAttributesMapper
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -49,14 +49,19 @@
}
if (!string.IsNullOrEmpty(assembly) && string.IsNullOrEmpty(@namespace))
{
- return string.Concat(type.Name, ", ", assembly);
+ return string.Concat(GetTypeNameForMapping(type), ", ", assembly);
}
if (string.IsNullOrEmpty(assembly) && !string.IsNullOrEmpty(@namespace))
{
return type.FullName;
}
- return type.Name;
+ return GetTypeNameForMapping(type);
}
+
+ private static string GetTypeNameForMapping(System.Type type)
+ {
+ return !type.IsGenericType ? type.Name: type.FullName;
+ }
}
}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeNameUtilTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeNameUtilTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeNameUtilTests.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,141 @@
+using System;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode
+{
+ public class MyEntity
+ {
+
+ }
+ public class MyGenericEntity<T>
+ {
+
+ }
+
+ public class TypeNameUtilTests
+ {
+ [Test]
+ public void WhenTypeNullThenNull()
+ {
+ System.Type variableType = null;
+ variableType.GetShortClassName(new HbmMapping()).Should().Be.Null();
+ }
+
+ [Test]
+ public void WhenMapDocNullThenAssemblyQualifiedName()
+ {
+ typeof(MyEntity).GetShortClassName(null).Should().Be.EqualTo(typeof(MyEntity).AssemblyQualifiedName);
+ }
+
+ [Test]
+ public void WhenMapDocDoesNotHaveDefaultsThenAssemblyQualifiedName()
+ {
+ var mapDoc = new HbmMapping();
+ typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).AssemblyQualifiedName);
+ }
+
+ [Test]
+ public void WhenMapDocHaveDefaultAssemblyThenFullName()
+ {
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = typeof(MyEntity).Assembly.FullName;
+ typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).FullName);
+ }
+
+ [Test]
+ public void WhenMapDocHaveDefaultAssemblyNameThenFullName()
+ {
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = typeof(MyEntity).Assembly.GetName().Name;
+ typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).FullName);
+ }
+
+ [Test]
+ public void WhenMapDocHaveDefaultsThenName()
+ {
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = typeof(MyEntity).Assembly.FullName;
+ mapDoc.@namespace = typeof(MyEntity).Namespace;
+ typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).Name);
+ }
+
+ [Test]
+ public void WhenMapDocDefaultsDoesNotMatchsThenAssemblyQualifiedName()
+ {
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = "whatever";
+ mapDoc.@namespace = "whatever";
+ typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).AssemblyQualifiedName);
+ }
+
+ [Test]
+ public void WhenMatchNamespaceButNotAssemblyThenOnlyNameAndAssembly()
+ {
+ // strange but possible
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = "whatever";
+ mapDoc.@namespace = typeof(MyEntity).Namespace;
+ typeof(MyEntity).GetShortClassName(mapDoc).Should().StartWith(typeof(MyEntity).Name).And.EndWith(", " + typeof(MyEntity).Assembly.GetName().Name);
+ }
+
+ [Test]
+ public void WithGenericWhenMapDocNullThenAssemblyQualifiedName()
+ {
+ typeof(MyGenericEntity<int>).GetShortClassName(null).Should().Be.EqualTo(typeof(MyGenericEntity<int>).AssemblyQualifiedName);
+ }
+
+ [Test]
+ public void WithGenericWhenMapDocDoesNotHaveDefaultsThenAssemblyQualifiedName()
+ {
+ var mapDoc = new HbmMapping();
+ typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).AssemblyQualifiedName);
+ }
+
+ [Test]
+ public void WithGenericWhenMapDocHaveDefaultAssemblyThenFullName()
+ {
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = typeof(MyGenericEntity<>).Assembly.FullName;
+ typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).FullName);
+ }
+
+ [Test]
+ public void WithGenericWhenMapDocHaveDefaultAssemblyNameThenFullName()
+ {
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = typeof(MyGenericEntity<>).Assembly.GetName().Name;
+ typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).FullName);
+ }
+
+ [Test]
+ public void WithGenericWhenMapDocHaveDefaultsThenName()
+ {
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = typeof(MyGenericEntity<>).Assembly.FullName;
+ mapDoc.@namespace = typeof(MyGenericEntity<>).Namespace;
+ typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).FullName);
+ }
+
+ [Test]
+ public void WithGenericWhenMapDocDefaultsDoesNotMatchsThenAssemblyQualifiedName()
+ {
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = "whatever";
+ mapDoc.@namespace = "whatever";
+ typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).AssemblyQualifiedName);
+ }
+
+ [Test]
+ public void WithGenericWhenMatchNamespaceButNotAssemblyThenOnlyNameAndAssembly()
+ {
+ // strange but possible
+ var mapDoc = new HbmMapping();
+ mapDoc.assembly = "whatever";
+ mapDoc.@namespace = typeof(MyGenericEntity<>).Namespace;
+ typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().StartWith(typeof(MyGenericEntity<int>).FullName).And.EndWith(", " + typeof(MyGenericEntity<int>).Assembly.GetName().Name);
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-23 18:51:34 UTC (rev 5751)
@@ -600,6 +600,7 @@
<Compile Include="MappingByCode\NatureDemo\Naturalness\StateProvince.cs" />
<Compile Include="MappingByCode\NatureDemo\Naturalness\User.cs" />
<Compile Include="MappingByCode\NatureDemo\Naturalness\Zoo.cs" />
+ <Compile Include="MappingByCode\TypeNameUtilTests.cs" />
<Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Fixture.cs" />
<Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Model.cs" />
<Compile Include="NHSpecificTest\BagWithLazyExtraAndFilter\Domain.cs" />
@@ -814,6 +815,15 @@
<Compile Include="ReadOnly\StudentDto.cs" />
<Compile Include="ReadOnly\TextHolder.cs" />
<Compile Include="ReadOnly\VersionedNode.cs" />
+ <Compile Include="Stateless\Contact.cs" />
+ <Compile Include="Stateless\Country.cs" />
+ <Compile Include="Stateless\FetchingLazyCollections\LazyCollectionFetchTests.cs" />
+ <Compile Include="Stateless\Fetching\Resource.cs" />
+ <Compile Include="Stateless\Fetching\StatelessSessionFetchingTest.cs" />
+ <Compile Include="Stateless\Fetching\Task.cs" />
+ <Compile Include="Stateless\Fetching\User.cs" />
+ <Compile Include="Stateless\Org.cs" />
+ <Compile Include="Stateless\StatelessSessionQueryFixture.cs" />
<Compile Include="Subselect\ClassSubselectFixture.cs" />
<Compile Include="Subselect\Domain.cs" />
<Compile Include="TestCaseMappingByCode.cs" />
@@ -2617,6 +2627,8 @@
<EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" />
</ItemGroup>
<ItemGroup>
+ <EmbeddedResource Include="Stateless\Contact.hbm.xml" />
+ <EmbeddedResource Include="Stateless\Fetching\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2660And2661\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\DataReaderWrapperTest\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2583\Mappings.hbm.xml" />
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,34 @@
+namespace NHibernate.Test.Stateless
+{
+ public class Contact
+ {
+ private int id;
+ private Org org;
+
+ public virtual int Id
+ {
+ get
+ {
+ return id;
+ }
+
+ set
+ {
+ id = value;
+ }
+ }
+
+ public virtual Org Org
+ {
+ get
+ {
+ return org;
+ }
+
+ set
+ {
+ org = value;
+ }
+ }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.hbm.xml 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
+ assembly="NHibernate.Test"
+ namespace="NHibernate.Test.Stateless">
+
+ <class name="Contact">
+ <id name="Id">
+ <generator class="native" />
+ </id>
+ <many-to-one name="Org" lazy="false" fetch="join" />
+ </class>
+
+ <class name="Org">
+ <id name="Id">
+ <generator class="native" />
+ </id>
+ <many-to-one name="Country" lazy="false" fetch="join" />
+ </class>
+
+ <class name="Country">
+ <id name="Id">
+ <generator class="native" />
+ </id>
+ </class>
+
+</hibernate-mapping>
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Country.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Country.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Country.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,20 @@
+namespace NHibernate.Test.Stateless
+{
+ public class Country
+ {
+ private int id;
+
+ public virtual int Id
+ {
+ get
+ {
+ return id;
+ }
+
+ set
+ {
+ id = value;
+ }
+ }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Mappings.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Mappings.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Mappings.hbm.xml 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
+ assembly="NHibernate.Test"
+ namespace="NHibernate.Test.Stateless.Fetching">
+ <class name="User" table="User_">
+ <id name="Id" type="long">
+ <generator class="increment" />
+ </id>
+ <property name="Name" />
+ </class>
+
+ <class name="Resource">
+ <id name="Id" type="long">
+ <generator class="increment" />
+ </id>
+ <property name="Name" />
+ <many-to-one name="Owner"/>
+ </class>
+
+ <class name="Task">
+ <id name="Id" type="long">
+ <generator class="increment" />
+ </id>
+ <property name="Description" />
+ <many-to-one name="User" column="user_"/>
+ <many-to-one name="Resource"/>
+ <property name="DueDate" />
+ <property name="StartDate" />
+ <property name="CompletionDate" />
+ </class>
+
+</hibernate-mapping>
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Resource.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Resource.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Resource.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,59 @@
+
+namespace NHibernate.Test.Stateless.Fetching
+{
+ public class Resource
+ {
+ private long? id;
+ private string name;
+ private User owner;
+
+ public Resource()
+ {
+ }
+
+ public Resource(string name, User owner)
+ {
+ this.name = name;
+ this.owner = owner;
+ }
+
+ public virtual long? Id
+ {
+ get
+ {
+ return id;
+ }
+
+ set
+ {
+ this.id = value;
+ }
+ }
+
+ public virtual string Name
+ {
+ get
+ {
+ return name;
+ }
+
+ set
+ {
+ this.name = value;
+ }
+ }
+
+ public virtual User Owner
+ {
+ get
+ {
+ return owner;
+ }
+
+ set
+ {
+ this.owner = value;
+ }
+ }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/StatelessSessionFetchingTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/StatelessSessionFetchingTest.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/StatelessSessionFetchingTest.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,75 @@
+using System;
+using System.Collections;
+using log4net;
+using NUnit.Framework;
+
+namespace NHibernate.Test.Stateless.Fetching
+{
+ [TestFixture]
+ public class StatelessSessionFetchingTest : TestCase
+ {
+ private static readonly ILog log = LogManager.GetLogger(typeof(StatelessSessionFetchingTest));
+
+ protected override string MappingsAssembly
+ {
+ get { return "NHibernate.Test"; }
+ }
+
+ protected override IList Mappings
+ {
+ get
+ {
+ return new[] { "Stateless.Fetching.Mappings.hbm.xml" };
+ }
+ }
+
+ [Test]
+ public void DynamicFetch()
+ {
+ using (ISession s = OpenSession())
+ using (ITransaction tx = s.BeginTransaction())
+ {
+ DateTime now = DateTime.Now;
+ User me = new User("me");
+ User you = new User("you");
+ Resource yourClock = new Resource("clock", you);
+ Task task = new Task(me, "clean", yourClock, now); // :)
+ s.Save(me);
+ s.Save(you);
+ s.Save(yourClock);
+ s.Save(task);
+ tx.Commit();
+ }
+
+ using (IStatelessSession ss = sessions.OpenStatelessSession())
+ using (ITransaction tx = ss.BeginTransaction())
+ {
+ ss.BeginTransaction();
+ Task taskRef =
+ (Task)ss.CreateQuery("from Task t join fetch t.Resource join fetch t.User").UniqueResult();
+ Assert.True(taskRef != null);
+ Assert.True(NHibernateUtil.IsInitialized(taskRef));
+ Assert.True(NHibernateUtil.IsInitialized(taskRef.User));
+ Assert.True(NHibernateUtil.IsInitialized(taskRef.Resource));
+ Assert.False(NHibernateUtil.IsInitialized(taskRef.Resource.Owner));
+ tx.Commit();
+ }
+
+ cleanup();
+ }
+
+ private void cleanup()
+ {
+ using (ISession s = OpenSession())
+ using (ITransaction tx = s.BeginTransaction())
+ {
+ s.BeginTransaction();
+ s.CreateQuery("delete Task").ExecuteUpdate();
+ s.CreateQuery("delete Resource").ExecuteUpdate();
+ s.CreateQuery("delete User").ExecuteUpdate();
+ tx.Commit();
+ }
+ }
+ }
+
+}
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Task.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Task.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Task.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,134 @@
+using System;
+
+
+namespace NHibernate.Test.Stateless.Fetching
+{
+ public class Task
+ {
+ private long? id;
+ private string description;
+ private User user;
+ private Resource resource;
+ private DateTime dueDate;
+ private DateTime? startDate;
+ private DateTime? completionDate;
+
+ public Task()
+ {
+ }
+
+ public Task(User user, string description, Resource resource, DateTime dueDate)
+ : this(user, description, resource, dueDate, null, null)
+ {
+ }
+
+ public Task(User user, string description, Resource resource, DateTime dueDate, DateTime? startDate, DateTime? completionDate)
+ {
+ this.user = user;
+ this.resource = resource;
+ this.description = description;
+ this.dueDate = dueDate;
+ this.startDate = startDate;
+ this.completionDate = completionDate;
+ }
+
+ public virtual long? Id
+ {
+ get
+ {
+ return id;
+ }
+
+ set
+ {
+ this.id = value;
+ }
+ }
+
+
+ public virtual User User
+ {
+ get
+ {
+ return user;
+ }
+
+ set
+ {
+ this.user = value;
+ }
+ }
+
+
+ public virtual Resource Resource
+ {
+ get
+ {
+ return resource;
+ }
+
+ set
+ {
+ this.resource = value;
+ }
+ }
+
+
+ public virtual string Description
+ {
+ get
+ {
+ return description;
+ }
+
+ set
+ {
+ this.description = value;
+ }
+ }
+
+
+ public virtual DateTime DueDate
+ {
+ get
+ {
+ return dueDate;
+ }
+
+ set
+ {
+ this.dueDate = value;
+ }
+ }
+
+
+ public virtual DateTime? StartDate
+ {
+ get
+ {
+ return startDate;
+ }
+
+ set
+ {
+ this.startDate = value;
+ }
+ }
+
+
+ public virtual DateTime? CompletionDate
+ {
+ get
+ {
+ return completionDate;
+ }
+
+ set
+ {
+ this.completionDate = value;
+ }
+ }
+
+ }
+
+}
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/User.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/User.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/User.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,45 @@
+
+namespace NHibernate.Test.Stateless.Fetching
+{
+ public class User
+ {
+ private long? id;
+ private string name;
+
+ public User()
+ {
+ }
+
+ public User(string name)
+ {
+ this.name = name;
+ }
+
+ public virtual long? Id
+ {
+ get
+ {
+ return id;
+ }
+
+ set
+ {
+ this.id = value;
+ }
+ }
+
+ public virtual string Name
+ {
+ get
+ {
+ return name;
+ }
+
+ set
+ {
+ this.name = value;
+ }
+ }
+
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/LazyCollectionFetchTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/LazyCollectionFetchTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/LazyCollectionFetchTests.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,142 @@
+using System;
+using System.Collections.Generic;
+using Iesi.Collections.Generic;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Mapping.ByCode.Conformist;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.Stateless.FetchingLazyCollections
+{
+ public class LazyCollectionFetchTests : TestCaseMappingByCode
+ {
+ protected override HbmMapping GetMappings()
+ {
+ var mapper = new ModelMapper();
+ mapper.BeforeMapClass += (mi, t, cm) => cm.Id(im => im.Generator(Generators.HighLow));
+ mapper.Class<Animal>(mc =>
+ {
+ mc.Id(x => x.Id);
+ mc.Discriminator(dm => dm.Column("kind"));
+ mc.Property(x => x.Description);
+ });
+ mapper.Subclass<Reptile>(mc => { mc.Property(x => x.BodyTemperature); });
+ mapper.Subclass<Human>(mc =>
+ {
+ mc.Property(x => x.Name);
+ mc.Property(x => x.NickName);
+ mc.Property(x => x.Birthdate, pm => pm.Type(NHibernateUtil.Date));
+ });
+ mapper.AddMapping<FamilyMap<Reptile>>();
+ mapper.AddMapping<FamilyMap<Human>>();
+ var mappings = mapper.CompileMappingForAllExplicitAddedEntities();
+ return mappings;
+ }
+
+ #region Nested type: FamilyMap
+
+ private class FamilyMap<T> : ClassMapping<Family<T>> where T : Animal
+ {
+ public FamilyMap()
+ {
+ string familyOf = typeof (T).Name;
+
+ Id(x => x.Id);
+ EntityName(familyOf + "Family");
+ Table("Families");
+ Discriminator(dm => dm.Column("familyKind"));
+ DiscriminatorValue(familyOf);
+ Where(string.Format("familyKind = '{0}'", familyOf));
+ ManyToOne(x => x.Father, map =>
+ {
+ map.Lazy(LazyRelation.NoLazy);
+ map.Class(typeof (T));
+ map.Cascade(Mapping.ByCode.Cascade.All);
+ });
+ ManyToOne(x => x.Mother, map =>
+ {
+ map.Lazy(LazyRelation.NoLazy);
+ map.Class(typeof (T));
+ map.Cascade(Mapping.ByCode.Cascade.All);
+ });
+ Set(x => x.Childs, cam =>
+ {
+ cam.Key(km => km.Column("familyId"));
+ cam.Cascade(Mapping.ByCode.Cascade.All);
+ },
+ rel => rel.OneToMany());
+ }
+ }
+
+ #endregion
+
+ [Test]
+ public void ShouldWorkLoadingComplexEntities()
+ {
+ const string crocodileFather = "Crocodile father";
+ const string crocodileMother = "Crocodile mother";
+
+ using (ISession s = sessions.OpenSession())
+ using (ITransaction tx = s.BeginTransaction())
+ {
+ var rf = new Reptile { Description = crocodileFather };
+ var rm = new Reptile { Description = crocodileMother };
+ var rc1 = new Reptile { Description = "Crocodile" };
+ var rc2 = new Reptile { Description = "Crocodile" };
+ var rfamily = new Family<Reptile>
+ {
+ Father = rf,
+ Mother = rm,
+ Childs = new HashedSet<Reptile> { rc1, rc2 }
+ };
+ s.Save("ReptileFamily", rfamily);
+ tx.Commit();
+ }
+
+ const string humanFather = "Fred";
+ const string humanMother = "Wilma";
+ using (ISession s = sessions.OpenSession())
+ using (ITransaction tx = s.BeginTransaction())
+ {
+ var hf = new Human { Description = "Flinstone", Name = humanFather };
+ var hm = new Human { Description = "Flinstone", Name = humanMother };
+ var hc1 = new Human { Description = "Flinstone", Name = "Pebbles" };
+ var hfamily = new Family<Human>
+ {
+ Father = hf,
+ Mother = hm,
+ Childs = new HashedSet<Human> { hc1 }
+ };
+ s.Save("HumanFamily", hfamily);
+ tx.Commit();
+ }
+
+ using (IStatelessSession s = sessions.OpenStatelessSession())
+ using (ITransaction tx = s.BeginTransaction())
+ {
+ IList<Family<Human>> hf = s.CreateQuery("from HumanFamily").List<Family<Human>>();
+ Assert.That(hf.Count, Is.EqualTo(1));
+ Assert.That(hf[0].Father.Name, Is.EqualTo(humanFather));
+ Assert.That(hf[0].Mother.Name, Is.EqualTo(humanMother));
+ NHibernateUtil.IsInitialized(hf[0].Childs).Should("Lazy collection should NOT be initialized").Be.False();
+
+ IList<Family<Reptile>> rf = s.CreateQuery("from ReptileFamily").List<Family<Reptile>>();
+ Assert.That(rf.Count, Is.EqualTo(1));
+ Assert.That(rf[0].Father.Description, Is.EqualTo(crocodileFather));
+ Assert.That(rf[0].Mother.Description, Is.EqualTo(crocodileMother));
+ NHibernateUtil.IsInitialized(hf[0].Childs).Should("Lazy collection should NOT be initialized").Be.False();
+
+ tx.Commit();
+ }
+
+ using (ISession s = sessions.OpenSession())
+ using (ITransaction tx = s.BeginTransaction())
+ {
+ s.Delete("from HumanFamily");
+ s.Delete("from ReptileFamily");
+ tx.Commit();
+ }
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/Stateless/Naturalness.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Naturalness.cs 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Naturalness.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -5,7 +5,7 @@
{
public abstract class Animal
{
- public virtual int Id { get; private set; }
+ public virtual int Id { get; protected set; }
public virtual string Description { get; set; }
}
@@ -25,7 +25,7 @@
{
private ISet<T> childs;
- public virtual int Id { get; private set; }
+ public virtual int Id { get; protected set; }
public virtual T Father { get; set; }
public virtual T Mother { get; set; }
public virtual ISet<T> Childs
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Org.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/Org.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/Org.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,34 @@
+namespace NHibernate.Test.Stateless
+{
+ public class Org
+ {
+ private int id;
+ private Country country;
+
+ public virtual int Id
+ {
+ get
+ {
+ return id;
+ }
+
+ set
+ {
+ id = value;
+ }
+ }
+
+ public virtual Country Country
+ {
+ get
+ {
+ return country;
+ }
+
+ set
+ {
+ country = value;
+ }
+ }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -0,0 +1,118 @@
+using System.Collections;
+using NHibernate.Cfg;
+using NUnit.Framework;
+
+namespace NHibernate.Test.Stateless
+{
+ [TestFixture]
+ public class StatelessSessionQueryFixture : TestCase
+ {
+ protected override string MappingsAssembly
+ {
+ get { return "NHibernate.Test"; }
+ }
+
+ protected override IList Mappings
+ {
+ get { return new[] {"Stateless.Contact.hbm.xml"}; }
+ }
+
+ protected override void Configure(Configuration configuration)
+ {
+ base.Configure(configuration);
+ cfg.SetProperty(Environment.MaxFetchDepth, 1.ToString());
+ }
+
+ private class TestData
+ {
+ internal readonly IList list = new ArrayList();
+
+ private readonly ISessionFactory sessions;
+
+ public TestData(ISessionFactory sessions)
+ {
+ this.sessions = sessions;
+ }
+
+ public virtual void createData()
+ {
+ using (ISession session = sessions.OpenSession())
+ {
+ using (ITransaction tx = session.BeginTransaction())
+ {
+ var usa = new Country();
+ session.Save(usa);
+ list.Add(usa);
+ var disney = new Org();
+ disney.Country = usa;
+ session.Save(disney);
+ list.Add(disney);
+ var waltDisney = new Contact();
+ waltDisney.Org = disney;
+ session.Save(waltDisney);
+ list.Add(waltDisney);
+ tx.Commit();
+ }
+ }
+ }
+
+ public virtual void cleanData()
+ {
+ using (ISession session = sessions.OpenSession())
+ {
+ using (ITransaction tx = session.BeginTransaction())
+ {
+ foreach (object obj in list)
+ {
+ session.Delete(obj);
+ }
+
+ tx.Commit();
+ }
+ }
+ }
+ }
+
+ [Test]
+ public void Criteria()
+ {
+ var testData = new TestData(sessions);
+ testData.createData();
+
+ using (IStatelessSession s = sessions.OpenStatelessSession())
+ {
+ Assert.AreEqual(1, s.CreateCriteria<Contact>().List().Count);
+ }
+
+ testData.cleanData();
+ }
+
+ [Test]
+ public void CriteriaWithSelectFetchMode()
+ {
+ var testData = new TestData(sessions);
+ testData.createData();
+
+ using (IStatelessSession s = sessions.OpenStatelessSession())
+ {
+ Assert.AreEqual(1, s.CreateCriteria<Contact>().SetFetchMode("Org", FetchMode.Select).List().Count);
+ }
+
+ testData.cleanData();
+ }
+
+ [Test]
+ public void Hql()
+ {
+ var testData = new TestData(sessions);
+ testData.createData();
+
+ using (IStatelessSession s = sessions.OpenStatelessSession())
+ {
+ Assert.AreEqual(1, s.CreateQuery("from Contact c join fetch c.Org join fetch c.Org.Country").List<Contact>().Count);
+ }
+
+ testData.cleanData();
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessWithRelationsFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessWithRelationsFixture.cs 2011-04-22 21:50:29 UTC (rev 5750)
+++ trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessWithRelationsFixture.cs 2011-04-23 18:51:34 UTC (rev 5751)
@@ -2,6 +2,7 @@
using Iesi.Collections.Generic;
using NUnit.Framework;
using System.Collections.Generic;
+using SharpTestsEx;
namespace NHibernate.Test.Stateless
{
@@ -66,13 +67,15 @@
Assert.That(hf.Count, Is.EqualTo(1));
Assert.That(hf[0].Father.Name, Is.EqualTo(humanFather));
Assert.That(hf[0].Mother.Name, Is.EqualTo(humanMother));
- Assert.That(hf[0].Childs, Is.Null, "Collections should be ignored by stateless session.");
+ NHibernateUtil.IsInitialized(hf[0].Childs).Should("No lazy collection should be initialized").Be.True();
+ //Assert.That(hf[0].Childs, Is.Null, "Collections should be ignored by stateless session.");
IList<Family<Reptile>> rf = s.CreateQuery("from ReptilesFamily").List<Family<Reptile>>();
Assert.That(rf.Count, Is.EqualTo(1));
Assert.That(rf[0].Father.Description, Is.EqualTo(crocodileFather));
Assert.That(rf[0].Mother.Description, Is.EqualTo(crocodileMother));
- Assert.That(rf[0].Childs, Is.Null, "Collections should be ignored by stateless session.");
+ NHibernateUtil.IsInitialized(hf[0].Childs).Should("No lazy collection should be initialized").Be.True();
+ //Assert.That(rf[0].Childs, Is.Null, "Collections should be ignored by stateless session.");
tx.Commit();
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|