Skip to content

Commit e21a590

Browse files
committed
HHH-18175 StatelessSession not incrementing @Version for entities with IDENTITY id generation
Signed-off-by: Gavin King <[email protected]>
1 parent d33ed62 commit e21a590

File tree

2 files changed

+77
-5
lines changed

2 files changed

+77
-5
lines changed

hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,14 +125,14 @@ public Object insert(String entityName, Object entity) {
125125
final EntityPersister persister = getEntityPersister( entityName, entity );
126126
final Object id;
127127
final Object[] state = persister.getValues( entity );
128+
if ( persister.isVersioned() ) {
129+
if ( seedVersion( entity, state, persister, this ) ) {
130+
persister.setValues( entity, state );
131+
}
132+
}
128133
final Generator generator = persister.getGenerator();
129134
if ( !generator.generatedOnExecution( entity, this ) ) {
130135
id = ( (BeforeExecutionGenerator) generator).generate( this, entity, null, INSERT );
131-
if ( persister.isVersioned() ) {
132-
if ( seedVersion( entity, state, persister, this ) ) {
133-
persister.setValues( entity, state );
134-
}
135-
}
136136
if ( firePreInsert(entity, id, state, persister) ) {
137137
return id;
138138
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package org.hibernate.orm.test.stateless;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.GeneratedValue;
5+
import jakarta.persistence.GenerationType;
6+
import jakarta.persistence.Id;
7+
import jakarta.persistence.Version;
8+
import org.hibernate.dialect.Dialect;
9+
import org.hibernate.dialect.OracleDialect;
10+
import org.hibernate.dialect.SQLServerDialect;
11+
import org.hibernate.testing.orm.junit.DomainModel;
12+
import org.hibernate.testing.orm.junit.SessionFactory;
13+
import org.hibernate.testing.orm.junit.SessionFactoryScope;
14+
import org.junit.jupiter.api.Test;
15+
16+
import java.util.UUID;
17+
18+
import static jakarta.persistence.GenerationType.IDENTITY;
19+
import static org.junit.jupiter.api.Assertions.assertEquals;
20+
21+
@SessionFactory
22+
@DomainModel(annotatedClasses = {StatelessSessionVersioningTest.IdentityVersioned.class,
23+
StatelessSessionVersioningTest.UUIDVersioned.class})
24+
public class StatelessSessionVersioningTest {
25+
@Test void testIdentity(SessionFactoryScope scope) {
26+
Dialect dialect = scope.getMetadataImplementor().getDatabase().getDialect();
27+
scope.inStatelessTransaction(s -> {
28+
IdentityVersioned v = new IdentityVersioned();
29+
s.insert(v);
30+
assertEquals(0, v.version);
31+
s.update(v);
32+
assertEquals(1, v.version);
33+
if ( !(dialect instanceof SQLServerDialect) && !(dialect instanceof OracleDialect) ) {
34+
//TODO: upsert() with IDENTITY not working on SQL Server
35+
//TODO: upsert() with version not working on Oracle
36+
s.upsert(v);
37+
assertEquals(2, v.version);
38+
}
39+
s.delete(v);
40+
});
41+
}
42+
@Test void testUUID(SessionFactoryScope scope) {
43+
Dialect dialect = scope.getMetadataImplementor().getDatabase().getDialect();
44+
scope.inStatelessTransaction(s -> {
45+
UUIDVersioned v = new UUIDVersioned();
46+
s.insert(v);
47+
assertEquals(0, v.version);
48+
s.update(v);
49+
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+
}
55+
s.delete(v);
56+
});
57+
}
58+
@Entity
59+
static class IdentityVersioned {
60+
@Id @GeneratedValue(strategy = IDENTITY)
61+
long id;
62+
@Version
63+
int version = -1;
64+
}
65+
@Entity
66+
static class UUIDVersioned {
67+
@Id @GeneratedValue(strategy = GenerationType.UUID)
68+
UUID id;
69+
@Version
70+
int version = -1;
71+
}
72+
}

0 commit comments

Comments
 (0)