Skip to content

Commit 92d9b07

Browse files
authored
Fix generation of version update statement for joined subclasses
Tests contributed by @lowds Fixes #1269
1 parent 9312c37 commit 92d9b07

File tree

5 files changed

+138
-7
lines changed

5 files changed

+138
-7
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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 System.Linq;
12+
using NUnit.Framework;
13+
using NHibernate.Linq;
14+
15+
namespace NHibernate.Test.NHSpecificTest.NH3069
16+
{
17+
using System.Threading.Tasks;
18+
[TestFixture]
19+
public class FixtureAsync : BugTestCase
20+
{
21+
protected override void OnSetUp()
22+
{
23+
using (var session = OpenSession())
24+
using (var tx = session.BeginTransaction())
25+
{
26+
var entity = new VersionableConcreate { Name = "Some Name" };
27+
session.Save(entity);
28+
29+
tx.Commit();
30+
}
31+
}
32+
33+
protected override void OnTearDown()
34+
{
35+
using (var session = OpenSession())
36+
using (var tx = session.BeginTransaction())
37+
{
38+
session.Delete("from VersionableAbstract");
39+
tx.Commit();
40+
}
41+
}
42+
43+
[Test]
44+
public async Task ShouldLockEntityAsync()
45+
{
46+
using (var session = OpenSession())
47+
using (var tx = session.BeginTransaction())
48+
{
49+
var entity = await (session.Query<VersionableConcreate>().SingleAsync());
50+
await (session.LockAsync(
51+
entity,
52+
LockMode.Force)); //exception is thrown here when incorrect update statement is generated
53+
await (tx.CommitAsync());
54+
}
55+
}
56+
}
57+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace NHibernate.Test.NHSpecificTest.NH3069
2+
{
3+
public abstract class VersionableAbstract
4+
{
5+
public long Id { get; set; }
6+
public int Version { get; set; }
7+
}
8+
9+
public class VersionableConcreate : VersionableAbstract
10+
{
11+
public string Name { get; set; }
12+
}
13+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System.Linq;
2+
using NUnit.Framework;
3+
4+
namespace NHibernate.Test.NHSpecificTest.NH3069
5+
{
6+
[TestFixture]
7+
public class Fixture : BugTestCase
8+
{
9+
protected override void OnSetUp()
10+
{
11+
using (var session = OpenSession())
12+
using (var tx = session.BeginTransaction())
13+
{
14+
var entity = new VersionableConcreate { Name = "Some Name" };
15+
session.Save(entity);
16+
17+
tx.Commit();
18+
}
19+
}
20+
21+
protected override void OnTearDown()
22+
{
23+
using (var session = OpenSession())
24+
using (var tx = session.BeginTransaction())
25+
{
26+
session.Delete("from VersionableAbstract");
27+
tx.Commit();
28+
}
29+
}
30+
31+
[Test]
32+
public void ShouldLockEntity()
33+
{
34+
using (var session = OpenSession())
35+
using (var tx = session.BeginTransaction())
36+
{
37+
var entity = session.Query<VersionableConcreate>().Single();
38+
session.Lock(
39+
entity,
40+
LockMode.Force); //exception is thrown here when incorrect update statement is generated
41+
tx.Commit();
42+
}
43+
}
44+
}
45+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" ?>
2+
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
3+
assembly="NHibernate.Test"
4+
namespace="NHibernate.Test.NHSpecificTest.NH3069"
5+
default-lazy="false">
6+
<class name="VersionableAbstract">
7+
<id name="Id" column="`id`" generator="identity"/>
8+
<version name="Version" column="`version`"/>
9+
10+
<joined-subclass name="VersionableConcreate">
11+
<key column="`VersionableAbstract_id`"/>
12+
<property name="Name" column="`name`"/>
13+
</joined-subclass>
14+
</class>
15+
</hibernate-mapping>

src/NHibernate/Persister/Entity/AbstractEntityPersister.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,7 @@ public virtual string VersionColumnName
683683
get { return versionColumnName; }
684684
}
685685

686+
[Obsolete("Please use RootTableName instead.")]
686687
protected internal string VersionedTableName
687688
{
688689
get { return GetTableName(0); }
@@ -1540,20 +1541,20 @@ public object[] GetDatabaseSnapshot(object id, ISessionImplementor session)
15401541
/// </summary>
15411542
protected SqlString GenerateSelectVersionString()
15421543
{
1543-
SqlSimpleSelectBuilder builder = new SqlSimpleSelectBuilder(Factory.Dialect, factory)
1544-
.SetTableName(VersionedTableName);
1544+
SqlSimpleSelectBuilder builder = new SqlSimpleSelectBuilder(Factory.Dialect, Factory)
1545+
.SetTableName(RootTableName);
15451546

15461547
if (IsVersioned)
1547-
builder.AddColumn(versionColumnName);
1548+
builder.AddColumn(VersionColumnName);
15481549
else
1549-
builder.AddColumns(rootTableKeyColumnNames);
1550+
builder.AddColumns(RootTableIdentifierColumnNames);
15501551

15511552
if (Factory.Settings.IsCommentsEnabled)
15521553
{
15531554
builder.SetComment("get version " + EntityName);
15541555
}
15551556

1556-
return builder.AddWhereFragment(rootTableKeyColumnNames, IdentifierType, " = ").ToSqlString();
1557+
return builder.AddWhereFragment(RootTableIdentifierColumnNames, IdentifierType, " = ").ToSqlString();
15571558
}
15581559

15591560
protected SqlString GenerateInsertGeneratedValuesSelectString()
@@ -1722,13 +1723,13 @@ public object ForceVersionIncrement(object id, object currentVersion, ISessionIm
17221723
private SqlCommandInfo GenerateVersionIncrementUpdateString()
17231724
{
17241725
SqlUpdateBuilder update = new SqlUpdateBuilder(Factory.Dialect, Factory);
1725-
update.SetTableName(GetTableName(0));
1726+
update.SetTableName(RootTableName);
17261727
if (Factory.Settings.IsCommentsEnabled)
17271728
{
17281729
update.SetComment("forced version increment");
17291730
}
17301731
update.AddColumn(VersionColumnName, VersionType);
1731-
update.SetIdentityColumn(IdentifierColumnNames, IdentifierType);
1732+
update.SetIdentityColumn(RootTableIdentifierColumnNames, IdentifierType);
17321733
update.SetVersionColumn(new string[] { VersionColumnName }, VersionType);
17331734
return update.ToSqlCommandInfo();
17341735
}

0 commit comments

Comments
 (0)