Skip to content

Commit 723823e

Browse files
committed
Progress
1 parent e832aed commit 723823e

File tree

5 files changed

+22
-9
lines changed

5 files changed

+22
-9
lines changed

data-hibernate-jpa/src/main/java/io/micronaut/data/hibernate/jakarta/data/HibernateJakartaDataPersistExceptionConverter.java

+5
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
import jakarta.data.exceptions.EntityExistsException;
2323
import jakarta.data.exceptions.OptimisticLockingFailureException;
2424
import jakarta.inject.Singleton;
25+
import jakarta.persistence.OptimisticLockException;
2526
import jakarta.persistence.PersistenceException;
27+
import org.hibernate.StaleStateException;
2628
import org.hibernate.exception.ConstraintViolationException;
2729

2830
/**
@@ -41,6 +43,9 @@ public Exception convert(Exception exception) {
4143
if (exception instanceof ConstraintViolationException) {
4244
throw new EntityExistsException(exception.getMessage(), exception);
4345
}
46+
if (exception instanceof StaleStateException || exception instanceof OptimisticLockException) {
47+
throw new EntityExistsException(exception.getMessage(), exception);
48+
}
4449
if (exception instanceof PersistenceException) {
4550
return new DataException(exception.getMessage(), exception);
4651
}

data-hibernate-jpa/src/main/java/io/micronaut/data/hibernate/operations/HibernateJpaOperations.java

+11-4
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import io.micronaut.data.model.runtime.QueryParameterBinding;
5252
import io.micronaut.data.model.runtime.RuntimeEntityRegistry;
5353
import io.micronaut.data.model.runtime.RuntimePersistentEntity;
54+
import io.micronaut.data.model.runtime.RuntimePersistentProperty;
5455
import io.micronaut.data.model.runtime.StoredQuery;
5556
import io.micronaut.data.model.runtime.UpdateBatchOperation;
5657
import io.micronaut.data.model.runtime.UpdateOperation;
@@ -410,11 +411,17 @@ public <T> T persist(@NonNull InsertOperation<T> operation) {
410411
return executeUpdate(operation, session, storedQuery);
411412
}
412413
T entity = operation.getEntity();
413-
// if (persistOrMergeOnSave) {
414-
// entity = session.merge(entity);
415-
// } else {
414+
if (persistOrMergeOnSave) {
415+
RuntimePersistentEntity<T> persistentEntity = getEntity(operation.getRootEntity());
416+
RuntimePersistentProperty<T> identity = persistentEntity.getIdentity();
417+
if (identity != null && identity.getProperty().get(entity) == null) {
418+
session.persist(entity);
419+
} else {
420+
entity = session.merge(entity);
421+
}
422+
} else {
416423
session.persist(entity);
417-
// }
424+
}
418425
flushIfNecessary(session, operation.getAnnotationMetadata());
419426
return entity;
420427
});

data-hibernate-jpa/src/test/groovy/io/micronaut/data/hibernate/jakarta_data/entity/EntityTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@
5959
* can run against a provider that supports any Entity type.
6060
*/
6161
//@Property(name = "jpa.default.properties.hibernate.show_sql", value = "true")
62+
@Property(name = "jpa.default.properties.uniqueResultOnFindOne", value = "true")
63+
@Property(name = "jpa.default.properties.persistOrMergeOnSave", value = "true")
6264
@H2DBProperties
6365
@MicronautTest(transactional = false)
6466
public class EntityTests {
@@ -148,7 +150,6 @@ public void testBasicRepository() {
148150
assertEquals(60L, numbers.findById(60L).orElseThrow().getId());
149151
}
150152

151-
@Disabled // Pending feature
152153
@Test
153154
public void testBasicRepositoryBuiltInMethods() {
154155

@@ -250,7 +251,6 @@ public void testBasicRepositoryBuiltInMethods() {
250251
assertEquals(0, boxes.findAll().count());
251252
}
252253

253-
@Disabled // Pending feature
254254
@Test
255255
public void testBasicRepositoryMethods() {
256256

data-hibernate-jpa/src/test/groovy/io/micronaut/data/hibernate/jakarta_data/persistence/PersistenceEntityTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
import jakarta.data.Sort;
88
import jakarta.data.exceptions.EntityExistsException;
99
import jakarta.data.exceptions.OptimisticLockingFailureException;
10-
import jakarta.data.repository.Find;
11-
import jakarta.data.repository.OrderBy;
1210
import jakarta.inject.Inject;
1311
import org.junit.jupiter.api.Disabled;
1412
import org.junit.jupiter.api.Test;
@@ -31,6 +29,8 @@
3129
* Execute tests with a Persistence specific entity with a repository that requires read and writes (AKA not read-only)
3230
*/
3331
//@Property(name = "jpa.default.properties.hibernate.show_sql", value = "true")
32+
@Property(name = "jpa.default.properties.uniqueResultOnFindOne", value = "true")
33+
@Property(name = "jpa.default.properties.persistOrMergeOnSave", value = "true")
3434
@H2DBProperties
3535
@MicronautTest(transactional = false)
3636
public class PersistenceEntityTests {

jakarta-data-tck/support/src/main/java/io/micronaut/validation/tck/TckDeployableContainer.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,8 @@ public ProtocolMetaData deploy(Archive<?> archive) {
144144

145145
ApplicationContext applicationContext = ApplicationContext.builder()
146146
.properties(Map.of(
147-
"jpa.default.properties.uniqueResultOnFindOne", "true"
147+
"jpa.default.properties.uniqueResultOnFindOne", "true",
148+
"jpa.default.properties.persistOrMergeOnSave", "true"
148149
))
149150
.classLoader(classLoader)
150151
.build()

0 commit comments

Comments
 (0)