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