Skip to content

Commit f49b86f

Browse files
Add test case for many-to-many with property ref
1 parent 539a814 commit f49b86f

File tree

5 files changed

+329
-0
lines changed

5 files changed

+329
-0
lines changed
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using NHibernate.Criterion;
12+
using NUnit.Framework;
13+
14+
namespace NHibernate.Test.PropertyRef
15+
{
16+
using System.Threading.Tasks;
17+
[TestFixture]
18+
public class ManyToManyPropertyRefFixtureAsync : TestCase
19+
{
20+
protected override string[] Mappings => new[] { "PropertyRef.ManyToManyWithPropertyRef.hbm.xml" };
21+
22+
protected override string MappingsAssembly => "NHibernate.Test";
23+
24+
private object _manyAId;
25+
26+
protected override void OnSetUp()
27+
{
28+
using (var session = OpenSession())
29+
using (var transaction = session.BeginTransaction())
30+
{
31+
var manyA = new ManyA { Number = 6, Value = "a value" };
32+
33+
var manyB1 = new ManyB { Number = 4, Value = "a value of b1" };
34+
var manyB2 = new ManyB { Number = 8, Value = "a value of b2" };
35+
var manyB3 = new ManyB { Number = 12, Value = "a value of b3" };
36+
37+
_manyAId = session.Save(manyA);
38+
session.Save(manyB1);
39+
session.Save(manyB2);
40+
session.Save(manyB3);
41+
42+
manyA.ManyBs.Add(manyB1);
43+
manyA.ManyBs.Add(manyB2);
44+
manyA.ManyBs.Add(manyB3);
45+
transaction.Commit();
46+
}
47+
}
48+
49+
protected override void OnTearDown()
50+
{
51+
using (var s = OpenSession())
52+
using (var t = s.BeginTransaction())
53+
{
54+
s.Delete("from System.Object");
55+
s.Flush();
56+
t.Commit();
57+
}
58+
}
59+
60+
[Test]
61+
public async Task Getting_a_ManyA_object_with_fetchmode_select_will_workAsync()
62+
{
63+
ManyA loadedManyA;
64+
using (var session = OpenSession())
65+
using (var transaction = session.BeginTransaction())
66+
{
67+
loadedManyA =
68+
await (session
69+
.CreateCriteria<ManyA>()
70+
.Add(Restrictions.IdEq(_manyAId))
71+
// Below Fetch is a no-op indeed, provided the mapping does not ask for eager fetching.
72+
// It is the equivalent of obsoleted SetFetchMode Select, which was also no-op, contrary
73+
// to what the SelectMode xml comment could let think. (This comment was valid only when
74+
// the enum was used for mapping, but not when used ins queries.)
75+
.Fetch(SelectMode.Skip, "ManyBs")
76+
.UniqueResultAsync<ManyA>());
77+
await (NHibernateUtil.InitializeAsync(loadedManyA.ManyBs));
78+
await (transaction.CommitAsync());
79+
}
80+
81+
/******************the select statements *************************************************************
82+
SELECT this_.Id as Id0_0_,
83+
this_.Number as Number0_0_,
84+
this_.Value as Value0_0_
85+
FROM ManyA this_
86+
WHERE this_.Id = 1 /# ?p0 /#
87+
88+
SELECT manybs0_.ManyBNumber as ManyBNum1_1_,
89+
manybs0_.ManyANumber as ManyANum2_1_,
90+
manyb1_.Id as Id2_0_,
91+
manyb1_.Number as Number2_0_,
92+
manyb1_.Value as Value2_0_
93+
FROM ManyBs manybs0_
94+
left outer join ManyB manyb1_ on manybs0_.ManyANumber = manyb1_.Number
95+
WHERE manybs0_.ManyBNumber =6 /# ?p0 #/
96+
*/
97+
98+
Assert.That(loadedManyA.ManyBs.Count, Is.EqualTo(3));
99+
}
100+
101+
[Test, Ignore("Not fixed yet")]
102+
public async Task Getting_a_ManyA_object_with_fetchmode_join_will_workAsync()
103+
{
104+
ManyA loadedManyA;
105+
using (var session = OpenSession())
106+
{
107+
using (var transaction = session.BeginTransaction())
108+
{
109+
loadedManyA =
110+
await (session
111+
.CreateCriteria<ManyA>()
112+
.Add(Restrictions.IdEq(_manyAId))
113+
.Fetch(SelectMode.Fetch, "ManyBs")
114+
.UniqueResultAsync<ManyA>());
115+
await (transaction.CommitAsync());
116+
}
117+
}
118+
119+
/******************the select statments *************************************************************
120+
SELECT this_.Id as Id0_1_,
121+
this_.Number as Number0_1_,
122+
this_.Value as Value0_1_,
123+
124+
manybs2_.ManyBNumber as ManyBNum1_3_,
125+
manyb3_.Id as ManyANum2_3_,
126+
manyb3_.Id as Id2_0_,
127+
manyb3_.Number as Number2_0_,
128+
manyb3_.Value as Value2_0_
129+
130+
FROM ManyA this_
131+
132+
left outer join ManyBs manybs2_ on this_.Number=manybs2_.ManyBNumber
133+
left outer join ManyB manyb3_ on manybs2_.ManyANumber=manyb3_.Number
134+
135+
WHERE this_.Id = 1 /# ?p0 #/
136+
Exception:
137+
System.Collections.Generic.KeyNotFoundException: Der angegebene Schlüssel war nicht im Wörterbuch angegeben.
138+
bei System.ThrowHelper.ThrowKeyNotFoundException()
139+
bei System.Collections.Generic.Dictionary`2.get_Item(TKey key)
140+
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.
141+
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.
142+
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.
143+
*/
144+
145+
Assert.That(loadedManyA.ManyBs.Count, Is.EqualTo(3));
146+
}
147+
}
148+
}
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: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
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+
private object _manyAId;
14+
15+
protected override void OnSetUp()
16+
{
17+
using (var session = OpenSession())
18+
using (var transaction = session.BeginTransaction())
19+
{
20+
var manyA = new ManyA { Number = 6, Value = "a value" };
21+
22+
var manyB1 = new ManyB { Number = 4, Value = "a value of b1" };
23+
var manyB2 = new ManyB { Number = 8, Value = "a value of b2" };
24+
var manyB3 = new ManyB { Number = 12, Value = "a value of b3" };
25+
26+
_manyAId = session.Save(manyA);
27+
session.Save(manyB1);
28+
session.Save(manyB2);
29+
session.Save(manyB3);
30+
31+
manyA.ManyBs.Add(manyB1);
32+
manyA.ManyBs.Add(manyB2);
33+
manyA.ManyBs.Add(manyB3);
34+
transaction.Commit();
35+
}
36+
}
37+
38+
protected override void OnTearDown()
39+
{
40+
using (var s = OpenSession())
41+
using (var t = s.BeginTransaction())
42+
{
43+
s.Delete("from System.Object");
44+
s.Flush();
45+
t.Commit();
46+
}
47+
}
48+
49+
[Test]
50+
public void Getting_a_ManyA_object_with_fetchmode_select_will_work()
51+
{
52+
ManyA loadedManyA;
53+
using (var session = OpenSession())
54+
using (var transaction = session.BeginTransaction())
55+
{
56+
loadedManyA =
57+
session
58+
.CreateCriteria<ManyA>()
59+
.Add(Restrictions.IdEq(_manyAId))
60+
// Below Fetch is a no-op indeed, provided the mapping does not ask for eager fetching.
61+
// It is the equivalent of obsoleted SetFetchMode Select, which was also no-op, contrary
62+
// to what the SelectMode xml comment could let think. (This comment was valid only when
63+
// the enum was used for mapping, but not when used ins queries.)
64+
.Fetch(SelectMode.Skip, "ManyBs")
65+
.UniqueResult<ManyA>();
66+
NHibernateUtil.Initialize(loadedManyA.ManyBs);
67+
transaction.Commit();
68+
}
69+
70+
/******************the select statements *************************************************************
71+
SELECT this_.Id as Id0_0_,
72+
this_.Number as Number0_0_,
73+
this_.Value as Value0_0_
74+
FROM ManyA this_
75+
WHERE this_.Id = 1 /# ?p0 /#
76+
77+
SELECT manybs0_.ManyBNumber as ManyBNum1_1_,
78+
manybs0_.ManyANumber as ManyANum2_1_,
79+
manyb1_.Id as Id2_0_,
80+
manyb1_.Number as Number2_0_,
81+
manyb1_.Value as Value2_0_
82+
FROM ManyBs manybs0_
83+
left outer join ManyB manyb1_ on manybs0_.ManyANumber = manyb1_.Number
84+
WHERE manybs0_.ManyBNumber =6 /# ?p0 #/
85+
*/
86+
87+
Assert.That(loadedManyA.ManyBs.Count, Is.EqualTo(3));
88+
}
89+
90+
[Test, Ignore("Not fixed yet")]
91+
public void Getting_a_ManyA_object_with_fetchmode_join_will_work()
92+
{
93+
ManyA loadedManyA;
94+
using (var session = OpenSession())
95+
{
96+
using (var transaction = session.BeginTransaction())
97+
{
98+
loadedManyA =
99+
session
100+
.CreateCriteria<ManyA>()
101+
.Add(Restrictions.IdEq(_manyAId))
102+
.Fetch(SelectMode.Fetch, "ManyBs")
103+
.UniqueResult<ManyA>();
104+
transaction.Commit();
105+
}
106+
}
107+
108+
/******************the select statments *************************************************************
109+
SELECT this_.Id as Id0_1_,
110+
this_.Number as Number0_1_,
111+
this_.Value as Value0_1_,
112+
113+
manybs2_.ManyBNumber as ManyBNum1_3_,
114+
manyb3_.Id as ManyANum2_3_,
115+
manyb3_.Id as Id2_0_,
116+
manyb3_.Number as Number2_0_,
117+
manyb3_.Value as Value2_0_
118+
119+
FROM ManyA this_
120+
121+
left outer join ManyBs manybs2_ on this_.Number=manybs2_.ManyBNumber
122+
left outer join ManyB manyb3_ on manybs2_.ManyANumber=manyb3_.Number
123+
124+
WHERE this_.Id = 1 /# ?p0 #/
125+
Exception:
126+
System.Collections.Generic.KeyNotFoundException: Der angegebene Schlüssel war nicht im Wörterbuch angegeben.
127+
bei System.ThrowHelper.ThrowKeyNotFoundException()
128+
bei System.Collections.Generic.Dictionary`2.get_Item(TKey key)
129+
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.
130+
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.
131+
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.
132+
*/
133+
134+
Assert.That(loadedManyA.ManyBs.Count, Is.EqualTo(3));
135+
}
136+
}
137+
}
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" column="`Number`"/>
9+
<property name="Value" column="`Value`"/>
10+
<bag name="ManyBs">
11+
<key column="ManyANumber" property-ref="Number"/>
12+
<many-to-many class="ManyB" column="ManyBNumber" 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" column="`Number`"/>
21+
<property name="Value" column="`Value`"/>
22+
</class>
23+
</hibernate-mapping>

0 commit comments

Comments
 (0)