Below is the mapping and class bodies.
I'm fairly new to this process; could you point me towards the JIRA?
Thanks!
======= Mapping ========
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="NHibernate.Test"
namespace="NHibernate.Test.DanTest">
<class name="Policy" table="policies">
<id name="Id">
<generator class="native" />
</id>
<property name="PolicyNumber" />
<set name="Tasks" inverse="true" cascade="save-update">
<key column="PolicyId" />
<one-to-many class="Task" />
</set>
</class>
<class name="Task" table="tasks">
<id name="Id">
<generator class="native" />
</id>
<property name="TaskName" />
<many-to-one name="Policy" column="PolicyId" />
<many-to-one name="TeamMember" column="TeamMemberId" />
</class>
<class name="TeamMember" table="teammembers">
<id name="Id">
<generator class="native" />
</id>
<property name="Name" />
</class>
</hibernate-mapping>
===== Classes ======
public class Policy
{
public Policy()
{
Tasks = new HashedSet<Task>();
}
public virtual int Id
{
get;
protected set;
}
public virtual int PolicyNumber
{
get;
set;
}
public virtual ISet<Task> Tasks
{
get;
protected set;
}
}
public class Task
{
public Task()
{
}
public virtual int Id
{
get;
protected set;
}
public virtual string TaskName
{
get;
set;
}
public virtual Policy Policy
{
get;
set;
}
public virtual TeamMember TeamMember
{
get;
set;
}
}
public class TeamMember
{
public virtual int Id
{
get;
protected set;
}
public virtual string Name
{
get;
set;
}
}
--
Dan
On Apr 29, 1:38 pm, "Richard Brown \(gmail\)"
<[email protected]> wrote:
> Really need to see the mappings too. Best to raise a JIRA and attach a
> patch there.
>
> Cheers,
> Richard
>
> --------------------------------------------------
> From: "Dan" <[email protected]>
> Sent: Thursday, April 29, 2010 7:14 PM
> To: "nhibernate-development" <[email protected]>
> Subject: [nhibernate-development] Fetch joining doesn't always work with
> Future()
>
>
>
> > I found a repeatable scenario where Fetch Join isn't working. I don't
> > know NHibernate well enough to troubleshoot exactly why it's
> > happening, but I was able to create a test in NHibernate.Tests that
> > triggers the issue. Here's how I'm able to repeat it:
>
> > Say you you have 3 entities. A root entity Policy has a 1-M to Tasks,
> > which has a M-1 to TeamMember.
>
> > class Policy
> > int Id
> > ISet<Task> Tasks
>
> > class Task
> > int Id
> > TeamMember TeamMember
>
> > Issue this query:
> > Policy p = s.CreateQuery("SELECT p FROM Policy p " +
> > "LEFT JOIN FETCH p.Tasks t " +
> > "WHERE p.Id = :id")
> > .SetParameter("id", p2.Id)
> > .FutureValue<Policy>().Value;
>
> > Then this one:
> > IEnumerable<Task> tasks = s.CreateQuery("SELECT t FROM Task t " +
> > "INNER JOIN FETCH t.TeamMember ")
> > .Future<Task>();
>
> > And this check will fail:
> > for each (Task t in tasks)
> > Assert.IsTrue(NHibernateUtil.IsInitialized(t.TeamMember))
>
> > Not all TeamMember properties on the returned set of tasks will be
> > initialized. They'll be uninitialized proxies. Oddly enough, if I
> > comment out the first query, the 2nd one does exactly what I would
> > expect it to do.
>
> > Is there a reason this is happening, or did I run into an obscure bug?
>
> > Here's the method body of my failing test:
>
> > [Test]
> > public void TestDansWeirdScenario()
> > {
> > Policy p1, p2;
> > Task t1, t2;
> > TeamMember tm1, tm2;
>
> > using (ISession s = sessions.OpenSession())
> > using (ITransaction t = s.BeginTransaction())
> > {
> > tm1 = new TeamMember() { Name = "Joe" };
> > tm2 = new TeamMember() { Name = "Bill" };
>
> > s.Save(tm1);
> > s.Save(tm2);
>
> > p1 = new Policy() { PolicyNumber = 5 };
> > p1.Tasks.Add(new Task() { Policy = p1, TaskName = "Call Customer",
> > TeamMember = tm1 });
>
> > p2 = new Policy() { PolicyNumber = 5 };
> > p1.Tasks.Add(new Task() { Policy = p2, TaskName = "Send Invoice",
> > TeamMember = tm2 });
> > p1.Tasks.Add(new Task() { Policy = p2, TaskName = "Something Else",
> > TeamMember = tm2 });
>
> > s.Save(p1);
> > s.Save(p2);
>
> > t.Commit();
> > }
>
> > using (ISession s = sessions.OpenSession())
> > using (ITransaction t = s.BeginTransaction())
> > {
> > Policy reloadP2 = s.CreateQuery("SELECT p FROM Policy p " +
> > "LEFT JOIN FETCH p.Tasks t " +
> > "WHERE p.Id = :id")
> > .SetParameter("id", p2.Id)
> > .FutureValue<Policy>().Value;
>
> > IEnumerable<Task> tasks = s.CreateQuery("SELECT t FROM Task t " +
> > "INNER JOIN FETCH t.TeamMember ")
> > .Future<Task>();
>
> > foreach (Task tsk in tasks)
> > {
> > Assert.IsTrue(NHibernateUtil.IsInitialized(tsk.TeamMember));
> > }
> > }
> > }