Skip to content

Commit 8c78c44

Browse files
committed
HHH-18176 upsert() with @Version-ed entity on Oracle
Signed-off-by: Gavin King <[email protected]>
1 parent e21a590 commit 8c78c44

File tree

3 files changed

+21
-10
lines changed

3 files changed

+21
-10
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/SqlAstTranslatorWithUpsert.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ protected void renderMergeInsert(OptionalTableUpdate optionalTableUpdate) {
191191

192192
protected void renderMergeUpdate(OptionalTableUpdate optionalTableUpdate) {
193193
final List<ColumnValueBinding> valueBindings = optionalTableUpdate.getValueBindings();
194+
final List<ColumnValueBinding> optimisticLockBindings = optionalTableUpdate.getOptimisticLockBindings();
194195

195196
appendSql( " when matched then update set " );
196197
for ( int i = 0; i < valueBindings.size(); i++ ) {
@@ -202,5 +203,21 @@ protected void renderMergeUpdate(OptionalTableUpdate optionalTableUpdate) {
202203
appendSql( "=" );
203204
binding.getColumnReference().appendColumnForWrite( this, "s" );
204205
}
206+
renderMatchedWhere( optimisticLockBindings );
207+
}
208+
209+
private void renderMatchedWhere(List<ColumnValueBinding> optimisticLockBindings) {
210+
if ( !optimisticLockBindings.isEmpty() ) {
211+
appendSql( " where " );
212+
for (int i = 0; i < optimisticLockBindings.size(); i++) {
213+
final ColumnValueBinding binding = optimisticLockBindings.get( i );
214+
if ( i>0 ) {
215+
appendSql(" and ");
216+
}
217+
binding.getColumnReference().appendColumnForWrite( this, "t" );
218+
appendSql("<=");
219+
binding.getValueExpression().accept( this );
220+
}
221+
}
205222
}
206223
}

hibernate-core/src/main/java/org/hibernate/dialect/identity/Oracle12cIdentityColumnSupport.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
*/
77
package org.hibernate.dialect.identity;
88

9-
import org.hibernate.dialect.Dialect;
109
import org.hibernate.generator.EventType;
1110
import org.hibernate.id.insert.GetGeneratedKeysDelegate;
1211
import org.hibernate.persister.entity.EntityPersister;
@@ -25,7 +24,7 @@ public boolean supportsIdentityColumns() {
2524

2625
@Override
2726
public String getIdentityColumnString(int type) {
28-
return "generated as identity";
27+
return "generated by default as identity";
2928
}
3029

3130
@Override

hibernate-core/src/test/java/org/hibernate/orm/test/stateless/StatelessSessionVersioningTest.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import jakarta.persistence.Id;
77
import jakarta.persistence.Version;
88
import org.hibernate.dialect.Dialect;
9-
import org.hibernate.dialect.OracleDialect;
109
import org.hibernate.dialect.SQLServerDialect;
1110
import org.hibernate.testing.orm.junit.DomainModel;
1211
import org.hibernate.testing.orm.junit.SessionFactory;
@@ -30,9 +29,8 @@ public class StatelessSessionVersioningTest {
3029
assertEquals(0, v.version);
3130
s.update(v);
3231
assertEquals(1, v.version);
33-
if ( !(dialect instanceof SQLServerDialect) && !(dialect instanceof OracleDialect) ) {
32+
if ( !(dialect instanceof SQLServerDialect) ) {
3433
//TODO: upsert() with IDENTITY not working on SQL Server
35-
//TODO: upsert() with version not working on Oracle
3634
s.upsert(v);
3735
assertEquals(2, v.version);
3836
}
@@ -47,11 +45,8 @@ public class StatelessSessionVersioningTest {
4745
assertEquals(0, v.version);
4846
s.update(v);
4947
assertEquals(1, v.version);
50-
if ( !(dialect instanceof OracleDialect) ) {
51-
//TODO: upsert() with version not working on Oracle
52-
s.upsert(v);
53-
assertEquals(2, v.version);
54-
}
48+
s.upsert(v);
49+
assertEquals(2, v.version);
5550
s.delete(v);
5651
});
5752
}

0 commit comments

Comments
 (0)