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