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