Skip to content

Commit 90b9596

Browse files
Add test case for #1214
1 parent 3f53ab6 commit 90b9596

File tree

4 files changed

+208
-0
lines changed

4 files changed

+208
-0
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System.Collections.Generic;
2+
3+
namespace NHibernate.Test.PropertyRef {
4+
public class ManyA {
5+
public ManyA () {
6+
ManyBs = new List<ManyB>();
7+
}
8+
9+
public long Id { get; set; }
10+
public long Number { get; set; }
11+
public string Value { get; set; }
12+
public IList<ManyB> ManyBs { get; set; }
13+
}
14+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace NHibernate.Test.PropertyRef {
2+
public class ManyB {
3+
public long Id { get; set; }
4+
public long Number { get; set; }
5+
public string Value { get; set; }
6+
}
7+
}
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
using NHibernate.Criterion;
2+
using NUnit.Framework;
3+
4+
namespace NHibernate.Test.PropertyRef
5+
{
6+
[TestFixture]
7+
public class ManyToManyPropertyRefFixture : TestCase
8+
{
9+
protected override string[] Mappings => new[] { "PropertyRef.ManyToManyWithPropertyRef.hbm.xml" };
10+
11+
protected override string MappingsAssembly => "NHibernate.Test";
12+
13+
protected override void OnTearDown()
14+
{
15+
using (ISession s = OpenSession())
16+
{
17+
s.Delete("from ManyA");
18+
s.Flush();
19+
s.Delete("from ManyB");
20+
s.Flush();
21+
}
22+
}
23+
24+
[Test]
25+
public void Getting_a_ManyA_object_with_fetchmode_select_will_work()
26+
{
27+
ManyA manyA;
28+
using (ISession session = OpenSession())
29+
{
30+
using (ITransaction transaction = session.BeginTransaction())
31+
{
32+
manyA = new ManyA { Number = 6, Value = "a value" };
33+
34+
var manyB1 = new ManyB { Number = 4, Value = "a value of b1" };
35+
var manyB2 = new ManyB { Number = 8, Value = "a value of b2" };
36+
var manyB3 = new ManyB { Number = 12, Value = "a value of b2" };
37+
38+
39+
session.Save(manyA);
40+
session.Save(manyB1);
41+
session.Save(manyB2);
42+
session.Save(manyB3);
43+
44+
manyA.ManyBs.Add(manyB1);
45+
manyA.ManyBs.Add(manyB2);
46+
manyA.ManyBs.Add(manyB3);
47+
transaction.Commit();
48+
}
49+
}
50+
51+
ManyA loadedManyA;
52+
using (ISession session = OpenSession())
53+
{
54+
using (ITransaction transaction = session.BeginTransaction())
55+
{
56+
#pragma warning disable 618
57+
loadedManyA = session.CreateCriteria<ManyA>().Add(Restrictions.IdEq(manyA.Id))
58+
.SetFetchMode("ManyBs", FetchMode.Select).UniqueResult<ManyA>();
59+
#pragma warning restore 618
60+
NHibernateUtil.Initialize(loadedManyA.ManyBs);
61+
transaction.Commit();
62+
}
63+
}
64+
65+
/******************the select statments *************************************************************
66+
SELECT this_.Id as Id0_0_,
67+
this_.Number as Number0_0_,
68+
this_.Value as Value0_0_
69+
FROM ManyA this_
70+
WHERE this_.Id = 1 /# ?p0 /#
71+
72+
73+
SELECT manybs0_.ManyBNumber as ManyBNum1_1_,
74+
manybs0_.ManyANumber as ManyANum2_1_,
75+
manyb1_.Id as Id2_0_,
76+
manyb1_.Number as Number2_0_,
77+
manyb1_.Value as Value2_0_
78+
FROM ManyBs manybs0_
79+
left outer join ManyB manyb1_ on manybs0_.ManyANumber = manyb1_.Number
80+
WHERE manybs0_.ManyBNumber =6 /# ?p0 #/
81+
*/
82+
83+
Assert.That(loadedManyA.ManyBs.Count, Is.EqualTo(3));
84+
}
85+
86+
[Test]
87+
public void Getting_a_ManyA_object_with_fetchmode_join_will_work()
88+
{
89+
ManyA manyA;
90+
ManyB manyB1;
91+
ManyB manyB2;
92+
ManyB manyB3;
93+
94+
using (ISession session = OpenSession())
95+
{
96+
using (ITransaction transaction = session.BeginTransaction())
97+
{
98+
manyA = new ManyA { Number = 6, Value = "a value" };
99+
100+
manyB1 = new ManyB { Number = 4, Value = "a value of b1" };
101+
manyB2 = new ManyB { Number = 8, Value = "a value of b2" };
102+
manyB3 = new ManyB { Number = 12, Value = "a value of b2" };
103+
104+
105+
session.Save(manyA);
106+
session.Save(manyB1);
107+
session.Save(manyB2);
108+
session.Save(manyB3);
109+
110+
manyA.ManyBs.Add(manyB1);
111+
manyA.ManyBs.Add(manyB2);
112+
manyA.ManyBs.Add(manyB3);
113+
transaction.Commit();
114+
}
115+
}
116+
117+
ManyB[] assosiatedObjects = new[] { manyB1, manyB2, manyB3 };
118+
119+
ManyA loadedManyA;
120+
using (ISession session = OpenSession())
121+
{
122+
using (ITransaction transaction = session.BeginTransaction())
123+
{
124+
#pragma warning disable 618
125+
loadedManyA = session.CreateCriteria<ManyA>().Add(Restrictions.IdEq(manyA.Id))
126+
.SetFetchMode("ManyBs", FetchMode.Join).UniqueResult<ManyA>();
127+
#pragma warning restore 618
128+
transaction.Commit();
129+
}
130+
}
131+
132+
/******************the select statments *************************************************************
133+
SELECT this_.Id as Id0_1_,
134+
this_.Number as Number0_1_,
135+
this_.Value as Value0_1_,
136+
137+
manybs2_.ManyBNumber as ManyBNum1_3_,
138+
manyb3_.Id as ManyANum2_3_,
139+
manyb3_.Id as Id2_0_,
140+
manyb3_.Number as Number2_0_,
141+
manyb3_.Value as Value2_0_
142+
143+
FROM ManyA this_
144+
145+
left outer join ManyBs manybs2_ on this_.Number=manybs2_.ManyBNumber
146+
left outer join ManyB manyb3_ on manybs2_.ManyANumber=manyb3_.Number
147+
148+
WHERE this_.Id = 1 /# ?p0 #/
149+
WARN:
150+
System.Collections.Generic.KeyNotFoundException: Der angegebene Schlüssel war nicht im Wörterbuch angegeben.
151+
bei System.ThrowHelper.ThrowKeyNotFoundException()
152+
bei System.Collections.Generic.Dictionary`2.get_Item(TKey key)
153+
bei NHibernate.Persister.Entity.AbstractEntityPersister.GetAppropriateUniqueKeyLoader(String propertyName, IDictionary`2 enabledFilters) in C:\Users\Armin\Projects\NHibernate\branches\2.1.x\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:Zeile 2047.
154+
bei NHibernate.Persister.Entity.AbstractEntityPersister.LoadByUniqueKey(String propertyName, Object uniqueKey, ISessionImplementor session) in C:\Users\Armin\Projects\NHibernate\branches\2.1.x\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:Zeile 2037.
155+
bei NHibernate.Type.EntityType.LoadByUniqueKey(String entityName, String uniqueKeyPropertyName, Object key, ISessionImplementor session) in C:\Users\Armin\Projects\NHibernate\branches\2.1.x\nhibernate\src\NHibernate\Type\EntityType.cs:Zeile 552. */
156+
157+
Assert.That(loadedManyA.ManyBs.Count, Is.EqualTo(3));
158+
for (int i = 0; i < loadedManyA.ManyBs.Count; i++)
159+
{
160+
Assert.That(loadedManyA.ManyBs[i].Id, Is.EqualTo(assosiatedObjects[i]));
161+
}
162+
}
163+
}
164+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test"
3+
namespace="NHibernate.Test.PropertyRef">
4+
<class name="ManyA" table="ManyA" lazy="false">
5+
<id name="Id">
6+
<generator class="native"/>
7+
</id>
8+
<property name="Number"/>
9+
<property name="Value"/>
10+
<bag name="ManyBs">
11+
<key column="ManyBNumber" property-ref="Number"/>
12+
<many-to-many class="ManyB" column="ManyANumber" property-ref="Number"/>
13+
</bag>
14+
</class>
15+
16+
<class name="ManyB" table="ManyB" lazy="false">
17+
<id name="Id">
18+
<generator class="native"/>
19+
</id>
20+
<property name="Number"/>
21+
<property name="Value"/>
22+
</class>
23+
</hibernate-mapping>

0 commit comments

Comments
 (0)