Skip to content

Hibernate bumps to leads to NPE when using identity generation and batching inserts #40425

@michalvavrik

Description

@michalvavrik

Describe the bug

After #40102 our app has NPEs and constrain validation failures for values that are clearly within limit.

Expected behavior

No NPE, no validation failure.

Actual behavior

00:44:00,489 INFO  [app] org.hibernate.HibernateException: java.lang.NullPointerException: Cannot invoke "java.util.concurrent.CompletionStage.toCompletableFuture()" because the return value of "java.util.function.Function.apply(Object)" is null
00:44:00,490 INFO  [app] 	at org.hibernate.reactive.session.impl.ReactiveExceptionConverter.convert(ReactiveExceptionConverter.java:28)
00:44:00,490 INFO  [app] 	at org.hibernate.reactive.session.impl.ReactiveSessionImpl.lambda$doFlush$27(ReactiveSessionImpl.java:988)
00:44:00,491 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)
00:44:00,491 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)
00:44:00,492 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
00:44:00,492 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2194)
00:44:00,493 INFO  [app] 	at org.hibernate.reactive.util.async.impl.AsyncTrampoline$TrampolineInternal.lambda$unroll$0(AsyncTrampoline.java:123)
00:44:00,494 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
00:44:00,494 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
00:44:00,495 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
00:44:00,495 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2179)
00:44:00,496 INFO  [app] 	at io.vertx.core.Future.lambda$toCompletionStage$3(Future.java:581)
00:44:00,496 INFO  [app] 	at io.vertx.core.impl.future.FutureImpl$4.onSuccess(FutureImpl.java:176)
00:44:00,497 INFO  [app] 	at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:66)
00:44:00,497 INFO  [app] 	at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:259)
00:44:00,498 INFO  [app] 	at io.vertx.sqlclient.impl.QueryResultBuilder.tryComplete(QueryResultBuilder.java:88)
00:44:00,498 INFO  [app] 	at io.vertx.sqlclient.impl.QueryResultBuilder.tryComplete(QueryResultBuilder.java:32)
00:44:00,498 INFO  [app] 	at io.vertx.core.Promise.complete(Promise.java:66)
00:44:00,499 INFO  [app] 	at io.vertx.core.Promise.handle(Promise.java:51)
00:44:00,499 INFO  [app] 	at io.vertx.core.Promise.handle(Promise.java:29)
00:44:00,500 INFO  [app] 	at io.vertx.core.impl.future.FutureImpl$4.onSuccess(FutureImpl.java:176)
00:44:00,500 INFO  [app] 	at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:66)
00:44:00,501 INFO  [app] 	at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:259)
00:44:00,501 INFO  [app] 	at io.vertx.core.impl.future.PromiseImpl.onSuccess(PromiseImpl.java:49)
00:44:00,501 INFO  [app] 	at io.vertx.core.impl.future.PromiseImpl.handle(PromiseImpl.java:41)
00:44:00,502 INFO  [app] 	at io.vertx.sqlclient.impl.TransactionImpl.lambda$wrap$0(TransactionImpl.java:72)
00:44:00,502 INFO  [app] 	at io.vertx.core.impl.future.FutureImpl$4.onSuccess(FutureImpl.java:176)
00:44:00,503 INFO  [app] 	at io.vertx.core.impl.future.FutureBase.lambda$emitSuccess$0(FutureBase.java:60)
00:44:00,503 INFO  [app] 	at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173)
00:44:00,504 INFO  [app] 	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166)
00:44:00,504 INFO  [app] 	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
00:44:00,504 INFO  [app] 	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
00:44:00,505 INFO  [app] 	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
00:44:00,505 INFO  [app] 	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
00:44:00,506 INFO  [app] 	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
00:44:00,506 INFO  [app] 	at java.base/java.lang.Thread.run(Thread.java:1583)
00:44:00,507 INFO  [app] Caused by: java.lang.NullPointerException: Cannot invoke "java.util.concurrent.CompletionStage.toCompletableFuture()" because the return value of "java.util.function.Function.apply(Object)" is null
00:44:00,507 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1150)
00:44:00,508 INFO  [app] 	... 27 more
00:41:52,230 INFO  [app] Caused by: jakarta.validation.ConstraintViolationException: Validation failed for classes [io.quarkus.ts.hibernate.reactive.database.Author] during persist time for groups [jakarta.validation.groups.Default, ]
00:41:52,230 INFO  [app] List of constraint violations:[
00:41:52,230 INFO  [app] 	ConstraintViolationImpl{interpolatedMessage='size must be between 0 and 10', propertyPath=name, rootBeanClass=class io.quarkus.ts.hibernate.reactive.database.Author, messageTemplate='{jakarta.validation.constraints.Size.message}'}
00:41:52,230 INFO  [app] ]
00:41:52,230 INFO  [app] 	at org.hibernate.boot.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:151)
00:41:52,230 INFO  [app] 	at org.hibernate.boot.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:81)
00:41:52,230 INFO  [app] 	at org.hibernate.action.internal.EntityInsertAction.preInsert(EntityInsertAction.java:251)
00:41:52,230 INFO  [app] 	at org.hibernate.reactive.engine.impl.ReactiveEntityRegularInsertAction.reactiveExecute(ReactiveEntityRegularInsertAction.java:59)
00:41:52,230 INFO  [app] 	at org.hibernate.reactive.engine.impl.ReactiveEntityInsertActionHolder.reactiveExecute(ReactiveEntityInsertActionHolder.java:62)
00:41:52,230 INFO  [app] 	at org.hibernate.reactive.engine.ReactiveActionQueue.lambda$executeActions$9(ReactiveActionQueue.java:631)
00:41:52,230 INFO  [app] 	at org.hibernate.reactive.util.impl.CompletionStages.lambda$loop$7(CompletionStages.java:410)
00:41:52,230 INFO  [app] 	at org.hibernate.reactive.util.impl.CompletionStages$ArrayLoop.next(CompletionStages.java:484)
00:41:52,230 INFO  [app] 	at org.hibernate.reactive.util.async.impl.AsyncTrampoline.lambda$asyncWhile$1(AsyncTrampoline.java:215)
00:41:52,231 INFO  [app] 	at org.hibernate.reactive.util.async.impl.AsyncTrampoline$TrampolineInternal.unroll(AsyncTrampoline.java:121)
00:41:52,231 INFO  [app] 	at org.hibernate.reactive.util.async.impl.AsyncTrampoline$TrampolineInternal.trampoline(AsyncTrampoline.java:102)
00:41:52,231 INFO  [app] 	at org.hibernate.reactive.util.async.impl.AsyncTrampoline.asyncWhile(AsyncTrampoline.java:197)
00:41:52,231 INFO  [app] 	at org.hibernate.reactive.util.async.impl.AsyncTrampoline.asyncWhile(AsyncTrampoline.java:215)
00:41:52,231 INFO  [app] 	at org.hibernate.reactive.util.impl.CompletionStages.loop(CompletionStages.java:411)
00:41:52,231 INFO  [app] 	at org.hibernate.reactive.util.impl.CompletionStages.loop(CompletionStages.java:382)
00:41:52,231 INFO  [app] 	at org.hibernate.reactive.engine.ReactiveActionQueue.executeActions(ReactiveActionQueue.java:628)
00:41:52,231 INFO  [app] 	at org.hibernate.reactive.engine.ReactiveActionQueue.lambda$executeActions$7(ReactiveActionQueue.java:526)
00:41:52,231 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187)
00:41:52,231 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2341)
00:41:52,231 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:144)
00:41:52,231 INFO  [app] 	at org.hibernate.reactive.engine.ReactiveActionQueue.executeActions(ReactiveActionQueue.java:526)
00:41:52,231 INFO  [app] 	at org.hibernate.reactive.event.impl.AbstractReactiveFlushingEventListener.performExecutions(AbstractReactiveFlushingEventListener.java:63)
00:41:52,231 INFO  [app] 	at org.hibernate.reactive.event.impl.DefaultReactiveFlushEventListener.lambda$reactiveOnFlush$0(DefaultReactiveFlushEventListener.java:42)
00:41:52,231 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187)
00:41:52,231 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2341)
00:41:52,231 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:144)
00:41:52,232 INFO  [app] 	at org.hibernate.reactive.event.impl.DefaultReactiveFlushEventListener.reactiveOnFlush(DefaultReactiveFlushEventListener.java:42)
00:41:52,232 INFO  [app] 	at org.hibernate.event.service.internal.EventListenerGroupImpl.lambda$fireEventOnEachListener$0(EventListenerGroupImpl.java:153)
00:41:52,232 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187)
00:41:52,232 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2341)
00:41:52,232 INFO  [app] 	at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:144)
00:41:52,232 INFO  [app] 	at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:153)
00:41:52,232 INFO  [app] 	at org.hibernate.reactive.session.impl.ReactiveSessionImpl.doFlush(ReactiveSessionImpl.java:982)
00:41:52,232 INFO  [app] 	... 117 more

How to Reproduce?

git clone [email protected]:quarkus-qe/quarkus-test-suite.git
cd quarkus-test-suite/sql-db/hibernate-reactive
mvn clean verify -Dreruns=0

The app code transforms errors to 400, so you might need to tweak it for debugging.

Output of uname -a or ver

Fedora 38

Output of java -version

OpenJDK 17

Quarkus version or git rev

999-SNAPSHOT

Build tool (ie. output of mvnw --version or gradlew --version)

Apache Maven 3.9.4

Additional information

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions