Skip to content

Commit 29a0ca5

Browse files
committed
HHH-19522 report failed optimistic lock checking for upsert()
- also fix the problem for upsert emulation with UPDATE/INSERT
1 parent 9d20671 commit 29a0ca5

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/OptionalTableUpdateOperation.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.Locale;
1313
import java.util.Objects;
1414

15+
import org.hibernate.StaleStateException;
1516
import org.hibernate.engine.jdbc.mutation.JdbcValueBindings;
1617
import org.hibernate.engine.jdbc.mutation.ParameterUsage;
1718
import org.hibernate.engine.jdbc.mutation.internal.JdbcValueDescriptorImpl;
@@ -23,6 +24,7 @@
2324
import org.hibernate.engine.jdbc.spi.JdbcServices;
2425
import org.hibernate.engine.spi.SessionFactoryImplementor;
2526
import org.hibernate.engine.spi.SharedSessionContractImplementor;
27+
import org.hibernate.exception.ConstraintViolationException;
2628
import org.hibernate.internal.util.collections.CollectionHelper;
2729
import org.hibernate.jdbc.Expectation;
2830
import org.hibernate.persister.entity.mutation.EntityMutationTarget;
@@ -48,6 +50,7 @@
4850
import org.hibernate.sql.model.internal.TableUpdateCustomSql;
4951
import org.hibernate.sql.model.internal.TableUpdateStandard;
5052

53+
import static org.hibernate.exception.ConstraintViolationException.ConstraintKind.UNIQUE;
5154
import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER;
5255

5356
/**
@@ -149,7 +152,16 @@ public void performMutation(
149152
"Upsert update altered no rows - inserting : %s",
150153
tableMapping.getTableName()
151154
);
152-
performInsert( jdbcValueBindings, session );
155+
try {
156+
performInsert( jdbcValueBindings, session );
157+
}
158+
catch (ConstraintViolationException cve) {
159+
throw cve.getKind() == UNIQUE
160+
// assume it was the primary key constraint which was violated,
161+
// due to a new version of the row existing in the database
162+
? new StaleStateException( mutationTarget.getRolePath(), cve )
163+
: cve;
164+
}
153165
}
154166
}
155167
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import jakarta.persistence.Entity;
88
import jakarta.persistence.Id;
99
import jakarta.persistence.Version;
10-
import org.hibernate.StaleObjectStateException;
10+
import org.hibernate.StaleStateException;
1111
import org.hibernate.testing.orm.junit.DomainModel;
1212
import org.hibernate.testing.orm.junit.SessionFactory;
1313
import org.hibernate.testing.orm.junit.SessionFactoryScope;
@@ -60,7 +60,7 @@ public class UpsertVersionedTest {
6060
} );
6161
fail();
6262
}
63-
catch (StaleObjectStateException sose) {
63+
catch (StaleStateException sse) {
6464
//expected
6565
}
6666
scope.inStatelessTransaction( s-> {

0 commit comments

Comments
 (0)