From: <fab...@us...> - 2011-03-09 12:25:02
|
Revision: 5448 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5448&view=rev Author: fabiomaulo Date: 2011-03-09 12:24:56 +0000 (Wed, 09 Mar 2011) Log Message: ----------- Fix NH-2565 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Event/Default/DefaultPersistEventListener.cs trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2565/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2565/Domain.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2565/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2565/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultPersistEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultPersistEventListener.cs 2011-03-09 05:46:42 UTC (rev 5447) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultPersistEventListener.cs 2011-03-09 12:24:56 UTC (rev 5448) @@ -83,6 +83,15 @@ //TODO: check that entry.getIdentifier().equals(requestedId) object entity = source.PersistenceContext.Unproxy(@event.Entity); + /* NH-2565: the UnProxy may return a "field interceptor proxy". When EntityName is null the session.GetEntityPersister will try to guess it. + * Instead change a session's method I'll try to guess the EntityName here. + * Because I'm using a session's method perhaps could be better if each session's method, which implementation forward to a method having the EntityName as parameter, + * use the BestGuessEntityName directly instead do "70 turns" before call it. + */ + if (@event.EntityName == null) + { + @event.EntityName = source.BestGuessEntityName(entity); + } IEntityPersister persister = source.GetEntityPersister(@event.EntityName, entity); object tempObject; Modified: trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2011-03-09 05:46:42 UTC (rev 5447) +++ trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2011-03-09 12:24:56 UTC (rev 5448) @@ -15,6 +15,7 @@ using NHibernate.Engine.Query.Sql; using NHibernate.Event; using NHibernate.Hql; +using NHibernate.Intercept; using NHibernate.Loader.Criteria; using NHibernate.Loader.Custom; using NHibernate.Loader.Custom.Sql; @@ -1043,8 +1044,8 @@ { if (entity.IsProxy()) { - INHibernateProxy proxy = entity as INHibernateProxy; - ILazyInitializer initializer = proxy.HibernateLazyInitializer; + INHibernateProxy proxy = entity as INHibernateProxy; + ILazyInitializer initializer = proxy.HibernateLazyInitializer; // it is possible for this method to be called during flush processing, // so make certain that we do not accidently initialize an uninitialized proxy @@ -1054,6 +1055,12 @@ } entity = initializer.GetImplementation(); } + if (FieldInterceptionHelper.IsInstrumented(entity)) + { + // NH: support of field-interceptor-proxy + IFieldInterceptor interceptor = FieldInterceptionHelper.ExtractFieldInterceptor(entity); + return interceptor.EntityName; + } EntityEntry entry = persistenceContext.GetEntry(entity); if (entry == null) { Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2565/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2565/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2565/Domain.cs 2011-03-09 12:24:56 UTC (rev 5448) @@ -0,0 +1,17 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.NH2565 +{ + public class Task + { + public virtual Guid Id { get; set; } + public virtual string Description { get; set; } + public virtual TaskActivity Activity { get; set; } + } + + public class TaskActivity + { + public virtual Guid Id { get; set; } + public virtual string Name { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2565/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2565/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2565/Fixture.cs 2011-03-09 12:24:56 UTC (rev 5448) @@ -0,0 +1,83 @@ +using System; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2565 +{ + public class Fixture: BugTestCase + { + private class TaskSavedScenario: IDisposable + { + private readonly ISessionFactory factory; + private readonly Guid taskId; + + public TaskSavedScenario(ISessionFactory factory) + { + this.factory = factory; + var activity = new TaskActivity{Name="Say Hello!"}; + var task = new Task { Description = "Nice to do", Activity = activity }; + using (var s = factory.OpenSession()) + using (var tx = s.BeginTransaction()) + { + s.Persist(task); + taskId = task.Id; + tx.Commit(); + } + } + + public Guid TaskId + { + get { return taskId; } + } + + public void Dispose() + { + using (var s = factory.OpenSession()) + using (var tx = s.BeginTransaction()) + { + s.Delete(s.Get<Task>(taskId)); + tx.Commit(); + } + } + } + + protected override void Configure(Cfg.Configuration configuration) + { + configuration.SetProperty(Cfg.Environment.ProxyFactoryFactoryClass, + typeof(ByteCode.Castle.ProxyFactoryFactory).AssemblyQualifiedName); + } + + [Test] + public void WhenUseLoadThenCanUsePersistToModify() + { + using (var scenario = new TaskSavedScenario(Sfi)) + { + using (var s = OpenSession()) + using (var tx = s.BeginTransaction()) + { + var task = s.Load<Task>(scenario.TaskId); + task.Description = "Could be something nice"; + s.Persist(task); + s.Executing(session => session.Persist(task)).NotThrows(); + tx.Commit(); + } + } + } + + [Test] + public void WhenUseGetThenCanUsePersistToModify() + { + using (var scenario = new TaskSavedScenario(Sfi)) + { + using (var s = OpenSession()) + using (var tx = s.BeginTransaction()) + { + var task = s.Get<Task>(scenario.TaskId); + task.Description = "Could be something nice"; + s.Executing(session => session.Persist(task)).NotThrows(); + tx.Commit(); + } + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2565/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2565/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2565/Mappings.hbm.xml 2011-03-09 12:24:56 UTC (rev 5448) @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2565"> + + <class name="Task"> + <id name="Id"> + <generator class="guid" /> + </id> + <property name="Description"/> + <many-to-one name="Activity" class="TaskActivity" cascade="all" lazy="no-proxy"/> + </class> + <class name="TaskActivity"> + <id name="Id"> + <generator class="guid" /> + </id> + <property name="Name"/> + </class> +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-03-09 05:46:42 UTC (rev 5447) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-03-09 12:24:56 UTC (rev 5448) @@ -645,6 +645,8 @@ <Compile Include="NHSpecificTest\NH2484\Model.cs" /> <Compile Include="NHSpecificTest\NH2507\Animal.cs" /> <Compile Include="NHSpecificTest\NH2507\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2565\Domain.cs" /> + <Compile Include="NHSpecificTest\NH2565\Fixture.cs" /> <Compile Include="NHSpecificTest\Properties\CompositePropertyRefTest.cs" /> <Compile Include="NHSpecificTest\Properties\DynamicEntityTest.cs" /> <Compile Include="NHSpecificTest\Properties\Model.cs" /> @@ -2475,6 +2477,7 @@ <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="NHSpecificTest\NH2565\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\AccessAndCorrectPropertyName\DogMapping.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\AccessAndCorrectPropertyName\PersonMapping.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2507\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |