From: <fab...@us...> - 2008-09-14 14:09:26
|
Revision: 3762 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3762&view=rev Author: fabiomaulo Date: 2008-09-14 14:09:37 +0000 (Sun, 14 Sep 2008) Log Message: ----------- Merge r3761 (fix NH-1483) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Event/Default/DefaultLoadEventListener.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/BaseClass.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/SubClass.cs Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultLoadEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultLoadEventListener.cs 2008-09-14 13:53:17 UTC (rev 3761) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultLoadEventListener.cs 2008-09-14 14:09:37 UTC (rev 3762) @@ -416,7 +416,7 @@ // Entity was found in second-level cache... // NH: Different behavior (take a look to options.ExactPersister (NH-295)) - if (!options.ExactPersister || entry.Subclass.Equals(persister.EntityName)) + if (!options.ExactPersister || persister.EntityMetamodel.SubclassEntityNames.Contains(entry.Subclass)) { return AssembleCacheEntry(entry, @event.EntityId, persister, @event); } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/BaseClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/BaseClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/BaseClass.cs 2008-09-14 14:09:37 UTC (rev 3762) @@ -0,0 +1,14 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.NH1483 +{ + public abstract class BaseClass + { + private Guid _id; + + public Guid Id + { + get { return _id; } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/Fixture.cs 2008-09-14 14:09:37 UTC (rev 3762) @@ -0,0 +1,111 @@ +using System; +using System.Data; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1483 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnTearDown() + { + DeleteAll(true); + } + + /// <summary> + /// Tests that a Subclass can be loaded from second level cache as the specifed + /// type of baseclass + /// </summary> + /// <typeparam name="TBaseClass">The type of the BaseClass to test.</typeparam> + public void TestLoadFromSecondLevelCache<TBaseClass>() where TBaseClass : BaseClass + { + //create a new persistent entity to work with + Guid id = CreateAndSaveNewSubclass().Id; + + using (ISession session = OpenSession()) + { + //make sure the entity can be pulled + TBaseClass entity = session.Get<TBaseClass>(id); + Assert.IsNotNull(entity); + } + + //delete the subclass so we know we will be getting + //it from the second level cache + DeleteAll(false); + + using (ISession session = OpenSession()) + { + //reload the subclass, this should pull it directly from cache + TBaseClass restoredEntity = session.Get<TBaseClass>(id); + + Assert.IsNotNull(restoredEntity); + } + } + + /// <summary> + /// Creates and save a new subclass to the database. + /// </summary> + /// <returns>the new persistent SubClass</returns> + private SubClass CreateAndSaveNewSubclass() + { + using (ISession session = OpenSession()) + { + using (ITransaction trans = session.BeginTransaction()) + { + SubClass entity = new SubClass(); + session.Save(entity); + trans.Commit(); + + return entity; + } + } + } + + /// <summary> + /// Deletes all the baseclass entities from the persistence medium + /// </summary> + /// <param name="inNHibernateScope">whether to delete the entities though NHibernate + /// scope our outside of the scope so that entities will still remain in the session cache</param> + private void DeleteAll(bool inNHibernateScope) + { + using (ISession session = OpenSession()) + { + if (inNHibernateScope) + { + using (ITransaction trans = session.BeginTransaction()) + { + session.Delete("from BaseClass"); + trans.Commit(); + } + } + else + { + //delete directly from the db + using (IDbCommand cmd = session.Connection.CreateCommand()) + { + cmd.CommandText = "DELETE FROM BaseClass"; + cmd.ExecuteNonQuery(); + } + } + } + } + + /// <summary> + /// Verifies that a subclass can be loaded from the second level cache + /// </summary> + [Test] + public void LoadSubclassFromSecondLevelCache() + { + TestLoadFromSecondLevelCache<SubClass>(); + } + + /// <summary> + /// Verifies that a subclass can be loaded from the second level cache + /// </summary> + [Test] + public void LoadSubclassFromSecondLevelCacheAsBaseClass() + { + TestLoadFromSecondLevelCache<BaseClass>(); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/Mappings.hbm.xml 2008-09-14 14:09:37 UTC (rev 3762) @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH1483" + assembly="NHibernate.Test" + default-access="field.camelcase-underscore"> + <class name="BaseClass" lazy="false" discriminator-value="0"> + <id name="Id" type="guid" + unsaved-value="null"> + <generator class="guid.comb" /> + </id> + <discriminator column="discriminator" type="System.Int32" /> + + <subclass name="SubClass" discriminator-value="1" lazy="false"/> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/SubClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/SubClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1483/SubClass.cs 2008-09-14 14:09:37 UTC (rev 3762) @@ -0,0 +1,8 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.NH1483 +{ + public class SubClass : BaseClass + { + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj 2008-09-14 13:53:17 UTC (rev 3761) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj 2008-09-14 14:09:37 UTC (rev 3762) @@ -466,6 +466,9 @@ <Compile Include="NHSpecificTest\NH1419\Entry.cs" /> <Compile Include="NHSpecificTest\NH1419\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1464\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1483\BaseClass.cs" /> + <Compile Include="NHSpecificTest\NH1483\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1483\SubClass.cs" /> <Compile Include="NHSpecificTest\NH280\Fixture.cs" /> <Compile Include="NHSpecificTest\NH280\Foo.cs" /> <Compile Include="NHSpecificTest\NH1018\Employee.cs" /> @@ -1453,6 +1456,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1483\Mappings.hbm.xml" /> <EmbeddedResource Include="TypesTest\EntityClass.hbm.xml" /> <EmbeddedResource Include="Events\Collections\Association\Bidirectional\ManyToMany\BidirectionalManyToManyBagToSetMapping.hbm.xml" /> <EmbeddedResource Include="Events\Collections\Association\Bidirectional\ManyToMany\BidirectionalManyToManySetToSetMapping.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |