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