From: <ric...@us...> - 2010-01-17 19:31:17
|
Revision: 4919 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4919&view=rev Author: ricbrown Date: 2010-01-17 19:31:11 +0000 (Sun, 17 Jan 2010) Log Message: ----------- Fix NH-2009 (Many-to-one fails when using property-ref against a joined property) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs trunk/nhibernate/src/NHibernate/Loader/Entity/EntityJoinWalker.cs trunk/nhibernate/src/NHibernate/Loader/JoinWalker.cs trunk/nhibernate/src/NHibernate/Mapping/ForeignKey.cs trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs trunk/nhibernate/src/NHibernate/Persister/Entity/IOuterJoinLoadable.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2009/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2009/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2009/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2009/Model.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2010-01-13 16:03:54 UTC (rev 4918) +++ trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2010-01-17 19:31:11 UTC (rev 4919) @@ -1137,7 +1137,7 @@ try { - fk.ReferencedTable = referencedClass.Table; + fk.AddReferencedTable(referencedClass); fk.AlignColumns(); } catch (MappingException me) Modified: trunk/nhibernate/src/NHibernate/Loader/Entity/EntityJoinWalker.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Entity/EntityJoinWalker.cs 2010-01-13 16:03:54 UTC (rev 4918) +++ trunk/nhibernate/src/NHibernate/Loader/Entity/EntityJoinWalker.cs 2010-01-17 19:31:11 UTC (rev 4919) @@ -29,6 +29,14 @@ } /// <summary> + /// Override to use the persister to change the table-alias for columns in join-tables + /// </summary> + protected override string GenerateAliasForColumn(string rootAlias, string column) + { + return Persister.GenerateTableAliasForColumn(rootAlias, column); + } + + /// <summary> /// Disable outer join fetching if this loader obtains an /// upgrade lock mode /// </summary> Modified: trunk/nhibernate/src/NHibernate/Loader/JoinWalker.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/JoinWalker.cs 2010-01-13 16:03:54 UTC (rev 4918) +++ trunk/nhibernate/src/NHibernate/Loader/JoinWalker.cs 2010-01-17 19:31:11 UTC (rev 4919) @@ -667,6 +667,11 @@ return buf.ToSqlString(); } + protected virtual string GenerateAliasForColumn(string rootAlias, string column) + { + return rootAlias; + } + /// <summary> /// Render the where condition for a (batch) load by identifier / collection key /// </summary> @@ -676,7 +681,8 @@ { // if not a composite key, use "foo in (?, ?, ?)" for batching // if no batch, and not a composite key, use "foo = ?" - InFragment inf = new InFragment().SetColumn(alias, columnNames[0]); + string tableAlias = GenerateAliasForColumn(alias, columnNames[0]); + InFragment inf = new InFragment().SetColumn(tableAlias, columnNames[0]); for (int i = 0; i < batchSize; i++) inf.AddValue(Parameter.Placeholder); Modified: trunk/nhibernate/src/NHibernate/Mapping/ForeignKey.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ForeignKey.cs 2010-01-13 16:03:54 UTC (rev 4918) +++ trunk/nhibernate/src/NHibernate/Mapping/ForeignKey.cs 2010-01-17 19:31:11 UTC (rev 4919) @@ -158,6 +158,18 @@ referencedColumns.Add(column); } + internal void AddReferencedTable(PersistentClass referencedClass) + { + if (referencedColumns.Count > 0) + { + referencedTable = referencedColumns[0].Value.Table; + } + else + { + referencedTable = referencedClass.Table; + } + } + public override string ToString() { if (!IsReferenceToPrimaryKey) Modified: trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2010-01-13 16:03:54 UTC (rev 4918) +++ trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2010-01-17 19:31:11 UTC (rev 4919) @@ -1817,6 +1817,16 @@ } } + public string GenerateTableAliasForColumn(string rootAlias, string column) + { + int propertyIndex = Array.IndexOf(SubclassColumnClosure, column); + + if (propertyIndex < 0) + return rootAlias; + + return GenerateTableAlias(rootAlias, SubclassColumnTableNumberClosure[propertyIndex]); + } + public string GenerateTableAlias(string rootAlias, int tableNumber) { if (tableNumber == 0) Modified: trunk/nhibernate/src/NHibernate/Persister/Entity/IOuterJoinLoadable.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Entity/IOuterJoinLoadable.cs 2010-01-13 16:03:54 UTC (rev 4918) +++ trunk/nhibernate/src/NHibernate/Persister/Entity/IOuterJoinLoadable.cs 2010-01-17 19:31:11 UTC (rev 4919) @@ -113,5 +113,10 @@ /// Return the alised identifier column names /// </summary> string[] ToIdentifierColumns(string alias); + + /// <summary> + /// Get the table alias used for the supplied column + /// </summary> + string GenerateTableAliasForColumn(string rootAlias, string column); } } \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2009 ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2009/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2009/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2009/Fixture.cs 2010-01-17 19:31:11 UTC (rev 4919) @@ -0,0 +1,50 @@ +using System; +using System.Collections; +using NHibernate.Criterion; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH2009 +{ + [TestFixture] + public class Fixture : BugTestCase + { + [Test] + public void PropertyRefToJoinedTable() + { + BlogPost savedBlogPost = new BlogPost(); + + using (ISession session = OpenSession()) + { + User user1 = new User(); + user1.FullName = "First User"; + user1.UserName = "User1"; + session.Save(user1); + + User user2 = new User(); + user2.FullName = "Second User"; + user2.UserName = "User2"; + session.Save(user2); + + savedBlogPost.Title = "Post 1"; + savedBlogPost.Poster = user1; + session.Save(savedBlogPost); + + session.Flush(); + session.Clear(); + } + + using (ISession session = OpenSession()) + { + var user = session.Get<BlogPost>(savedBlogPost.ID); + } + + using (ISession session = OpenSession()) + using (ITransaction tx = session.BeginTransaction()) + { + session.Delete("from User"); + session.Delete("from BlogPost"); + tx.Commit(); + } + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2009/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2009/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2009/Mappings.hbm.xml 2010-01-17 19:31:11 UTC (rev 4919) @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH2009" + assembly="NHibernate.Test"> + + <class name="BlogPost" table="blogpost_table"> + <id name="ID" column="blogpost_id"> + <generator class="native"/> + </id> + <property name="Title" column="blogpost_title"/> + <many-to-one name="Poster" column="poster_id" property-ref="UserName" /> + </class> + + <class name="User" table="user_table"> + <id name="ID" column="user_id"> + <generator class="native"/> + </id> + <property name="FullName" column="user_fullname" unique="true"/> + <join table="ADUser"> + <key column="user_id"/> + <property name="UserName" column="aduser_username" unique="true"/> + </join> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2009/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2009/Model.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2009/Model.cs 2010-01-17 19:31:11 UTC (rev 4919) @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NHibernate.Test.NHSpecificTest.NH2009 +{ + public class BlogPost + { + public virtual int ID { get; set; } + public virtual string Title { get; set; } + public virtual User Poster { get; set; } + } + + public class User + { + public virtual int ID { get; set; } + public virtual string FullName { get; set; } + public virtual string UserName { get; set; } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-01-13 16:03:54 UTC (rev 4918) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-01-17 19:31:11 UTC (rev 4919) @@ -663,6 +663,8 @@ <Compile Include="NHSpecificTest\NH1978\_401k.cs" /> <Compile Include="NHSpecificTest\NH1989\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1989\Model.cs" /> + <Compile Include="NHSpecificTest\NH2009\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2009\Model.cs" /> <Compile Include="NHSpecificTest\NH2044\DomainClass.cs" /> <Compile Include="NHSpecificTest\NH2044\SampleTest.cs" /> <Compile Include="NHSpecificTest\NH2055\AuxType.cs" /> @@ -2108,6 +2110,7 @@ <EmbeddedResource Include="DriverTest\SqlServerCeEntity.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> <EmbeddedResource Include="NHSpecificTest\NH2065\Mappings.hbm.xml" /> + <EmbeddedResource Include="NHSpecificTest\NH2009\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1989\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1978\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2044\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |