From: <fab...@us...> - 2011-03-24 20:38:30
|
Revision: 5523 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5523&view=rev Author: fabiomaulo Date: 2011-03-24 20:38:23 +0000 (Thu, 24 Mar 2011) Log Message: ----------- NH-1323 no viable Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1323/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1323/CheckViability.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1323/Domain.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1323/Mappings.hbm.xml Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1323/CheckViability.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1323/CheckViability.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1323/CheckViability.cs 2011-03-24 20:38:23 UTC (rev 5523) @@ -0,0 +1,202 @@ +using System; +using NHibernate.Collection; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH1323 +{ + [Explicit("Demonstration of not viability")] + public class CheckViability: BugTestCase + { + public class FullInitializedRetrievedEntity : IDisposable + { + private readonly ISessionFactory factory; + private readonly MyClass entity; + + public FullInitializedRetrievedEntity(ISessionFactory factory) + { + this.factory = factory; + object savedId; + using (var session = factory.OpenSession()) + using (session.BeginTransaction()) + { + var entity = new MyClass(); + entity.Children.Add(new MyChild { Parent = entity }); + entity.Components.Add(new MyComponent { Something = "something" }); + entity.Elements.Add("somethingelse"); + savedId = session.Save(entity); + session.Transaction.Commit(); + } + + using (var session = factory.OpenSession()) + using (session.BeginTransaction()) + { + entity = session.Get<MyClass>(savedId); + NHibernateUtil.Initialize(entity.Children); + NHibernateUtil.Initialize(entity.Components); + NHibernateUtil.Initialize(entity.Elements); + session.Transaction.Commit(); + } + } + + public MyClass Entity + { + get { return entity; } + } + + public void Dispose() + { + using (var s = factory.OpenSession()) + { + s.Delete("from MyClass"); + s.Flush(); + } + } + } + + [Test] + public void WhenReassociateCollectionUsingMergeThenReassingOwner() + { + using (var scenario = new FullInitializedRetrievedEntity(Sfi)) + { + ((IPersistentCollection)scenario.Entity.Children).Owner = null; + ((IPersistentCollection)scenario.Entity.Components).Owner = null; + ((IPersistentCollection)scenario.Entity.Elements).Owner = null; + + // When I reassociate the collections the Owner has value + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var merged = (MyClass)session.Merge(scenario.Entity); + ((IPersistentCollection)merged.Children).Owner.Should().Not.Be.Null(); + ((IPersistentCollection)merged.Components).Owner.Should().Not.Be.Null(); + ((IPersistentCollection)merged.Elements).Owner.Should().Not.Be.Null(); + session.Transaction.Commit(); + } + } + } + + [Test] + public void WhenReassociateCollectionUsingLockThenTheCommitNotThrows() + { + using (var scenario = new FullInitializedRetrievedEntity(Sfi)) + { + ((IPersistentCollection)scenario.Entity.Children).Owner = null; + ((IPersistentCollection)scenario.Entity.Components).Owner = null; + ((IPersistentCollection)scenario.Entity.Elements).Owner = null; + + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + // When I reassociate the collections the Owner is null + session.Lock(scenario.Entity, LockMode.None); + // If I change something in each collection, there is no problems + scenario.Entity.Children.Add(new MyChild { Parent = scenario.Entity }); + scenario.Entity.Components.Add(new MyComponent { Something = "something" }); + scenario.Entity.Elements.Add("somethingelse"); + session.Transaction.Commit(); + } + + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var fresh = session.Get<MyClass>(scenario.Entity.Id); + fresh.Children.Should().Have.Count.EqualTo(2); + fresh.Components.Should().Have.Count.EqualTo(2); + fresh.Elements.Should().Have.Count.EqualTo(2); + session.Transaction.Commit(); + } + } + } + + [Test] + public void WhenReassociateCollectionUsingUpdateThenTheCommitNotThrows() + { + using (var scenario = new FullInitializedRetrievedEntity(Sfi)) + { + ((IPersistentCollection)scenario.Entity.Children).Owner = null; + ((IPersistentCollection)scenario.Entity.Components).Owner = null; + ((IPersistentCollection)scenario.Entity.Elements).Owner = null; + + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + scenario.Entity.Children.Add(new MyChild { Parent = scenario.Entity }); + scenario.Entity.Components.Add(new MyComponent { Something = "something" }); + scenario.Entity.Elements.Add("somethingelse"); + // When I reassociate the collections the Owner is null + session.Update(scenario.Entity); + session.Transaction.Commit(); + } + + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var fresh = session.Get<MyClass>(scenario.Entity.Id); + fresh.Children.Should().Have.Count.EqualTo(2); + fresh.Components.Should().Have.Count.EqualTo(2); + fresh.Elements.Should().Have.Count.EqualTo(2); + session.Transaction.Commit(); + } + } + } + + [Test] + public void WhenReassociateCollectionUsingSaveOrUpdateThenTheCommitNotThrows() + { + using (var scenario = new FullInitializedRetrievedEntity(Sfi)) + { + ((IPersistentCollection)scenario.Entity.Children).Owner = null; + ((IPersistentCollection)scenario.Entity.Components).Owner = null; + ((IPersistentCollection)scenario.Entity.Elements).Owner = null; + + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + scenario.Entity.Children.Add(new MyChild { Parent = scenario.Entity }); + scenario.Entity.Components.Add(new MyComponent { Something = "something" }); + scenario.Entity.Elements.Add("somethingelse"); + // When I reassociate the collections the Owner is null + session.SaveOrUpdate(scenario.Entity); + session.Transaction.Commit(); + } + + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var fresh = session.Get<MyClass>(scenario.Entity.Id); + fresh.Children.Should().Have.Count.EqualTo(2); + fresh.Components.Should().Have.Count.EqualTo(2); + fresh.Elements.Should().Have.Count.EqualTo(2); + session.Transaction.Commit(); + } + } + } + + [Test] + public void WhenReassociateCollectionUsingDeleteThenTheCommitNotThrows() + { + using (var scenario = new FullInitializedRetrievedEntity(Sfi)) + { + ((IPersistentCollection)scenario.Entity.Children).Owner = null; + ((IPersistentCollection)scenario.Entity.Components).Owner = null; + ((IPersistentCollection)scenario.Entity.Elements).Owner = null; + + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + session.Delete(scenario.Entity); + session.Transaction.Commit(); + } + + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var fresh = session.Get<MyClass>(scenario.Entity.Id); + fresh.Should().Be.Null(); + session.Transaction.Commit(); + } + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1323/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1323/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1323/Domain.cs 2011-03-24 20:38:23 UTC (rev 5523) @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH1323 +{ + [Serializable] + public class MyClass + { + public MyClass() + { + Children = new List<MyChild>(); + Components = new List<MyComponent>(); + Elements = new List<string>(); + } + public virtual string Description { get; set; } + public virtual Guid Id { get; set; } + public virtual IList<MyChild> Children { get; set; } + public virtual IList<MyComponent> Components { get; set; } + public virtual IList<string> Elements { get; set; } + } + + [Serializable] + public class MyChild + { + public virtual Guid Id { get; set; } + public virtual MyClass Parent { get; set; } + } + + [Serializable] + public class MyComponent + { + public virtual string Something { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1323/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1323/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1323/Mappings.hbm.xml 2011-03-24 20:38:23 UTC (rev 5523) @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH1323" + assembly="NHibernate.Test"> + <class name="MyClass"> + <id name="Id" type="Guid"> + <generator class="guid.comb" /> + </id> + <property name="Description" /> + <bag name="Children" inverse="true" cascade="all,delete-orphan"> + <key column="ParentId" on-delete="cascade" /> + <one-to-many class="MyChild" /> + </bag> + <bag name="Components" table="MyClassComponents"> + <key column="MyClassId" /> + <composite-element class="MyComponent"> + <property name="Something" /> + </composite-element> + </bag> + <bag name="Elements" table="MyClassElements"> + <key column="MyClassId" /> + <element column="ElementsElement" type="String" /> + </bag> + </class> + <class name="MyChild"> + <id name="Id" type="Guid"> + <generator class="guid.comb" /> + </id> + <many-to-one name="Parent" column="ParentId" /> + </class> +</hibernate-mapping> \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-03-24 18:47:41 UTC (rev 5522) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-03-24 20:38:23 UTC (rev 5523) @@ -524,6 +524,8 @@ <Compile Include="NHSpecificTest\NH1136\Person.cs" /> <Compile Include="NHSpecificTest\NH1136\ReverseSortComparer.cs" /> <Compile Include="NHSpecificTest\NH1136\TemporalAddressType.cs" /> + <Compile Include="NHSpecificTest\NH1323\CheckViability.cs" /> + <Compile Include="NHSpecificTest\NH1323\Domain.cs" /> <Compile Include="NHSpecificTest\NH1421\AnEntity.cs" /> <Compile Include="NHSpecificTest\NH1421\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1836\Entity.cs" /> @@ -2484,6 +2486,7 @@ <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="NHSpecificTest\NH1323\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2580\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2390\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2491\Mappings.hbm.xml" /> @@ -2879,7 +2882,6 @@ <EmbeddedResource Include="DynamicEntity\Tuplizer\Customer.hbm.xml" /> </ItemGroup> <ItemGroup> - <Folder Include="NHSpecificTest\NH2554" /> <Folder Include="Properties\" /> </ItemGroup> <ItemGroup> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |