Hi, we are facing the problem that we're running into an java.lang.UnsupportedOperationException
when trying to update an associated entity. We're using hibernate-reactive with Quarkus. I know there has been an issue #506 that should have fixed that problem but it doesn't seem to work for us.
When calling the CampaignDao#update
method without having an instance of Schedule
associated with a Campaign
the Schedule
instance gets stored as expected. The Exception occurs after callling that method after a Schedule
instance has been associated with a Campaign
and persisted.
I'm creating this issue since I couldn't find an example implementation in your examples
folder. Maybe you could also include one on how to update associated entities.
javax.persistence.PersistenceException: org.hibernate.HibernateException: javax.persistence.PersistenceException: org.hibernate.HibernateException: java.lang.UnsupportedOperationException
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154) ~[hibernate-core-5.4.29.Final.jar:5.4.29.Final]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) ~[hibernate-core-5.4.29.Final.jar:5.4.29.Final]
at org.hibernate.reactive.session.impl.ReactiveExceptionConverter.convert(ReactiveExceptionConverter.java:31) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.lambda$doFlush$34(ReactiveSessionImpl.java:879) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:930) ~[?:?]
at java.util.concurrent.CompletableFuture.uniHandleStage(CompletableFuture.java:946) ~[?:?]
at java.util.concurrent.CompletableFuture.handle(CompletableFuture.java:2266) ~[?:?]
at java.util.concurrent.CompletableFuture.handle(CompletableFuture.java:143) ~[?:?]
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.doFlush(ReactiveSessionImpl.java:874) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.reactiveFlush(ReactiveSessionImpl.java:856) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.mutiny.impl.MutinySessionImpl.lambda$flush$0(MutinySessionImpl.java:57) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at io.smallrye.context.impl.wrappers.SlowContextualSupplier.get(SlowContextualSupplier.java:21) ~[smallrye-context-propagation-1.1.0.jar:?]
at io.smallrye.mutiny.operators.uni.builders.UniCreateFromCompletionStage.subscribe(UniCreateFromCompletionStage.java:24) ~[mutiny-0.14.0.jar:?]
at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36) ~[mutiny-0.14.0.jar:?]
at io.smallrye.mutiny.operators.uni.UniRunSubscribeOn.lambda$subscribe$0(UniRunSubscribeOn.java:27) ~[mutiny-0.14.0.jar:?]
at org.hibernate.reactive.mutiny.impl.MutinySessionFactoryImpl.lambda$new$1(MutinySessionFactoryImpl.java:53) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at io.smallrye.mutiny.operators.uni.UniRunSubscribeOn.subscribe(UniRunSubscribeOn.java:25) ~[mutiny-0.14.0.jar:?]
at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36) ~[mutiny-0.14.0.jar:?]
at io.smallrye.mutiny.operators.uni.UniOnItemTransform.subscribe(UniOnItemTransform.java:22) ~[mutiny-0.14.0.jar:?]
at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36) ~[mutiny-0.14.0.jar:?]
at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.performInnerSubscription(UniOnItemTransformToUni.java:81) ~[mutiny-0.14.0.jar:?]
at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.onItem(UniOnItemTransformToUni.java:57) ~[mutiny-0.14.0.jar:?]
at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.onItem(UniOnItemTransformToUni.java:60) ~[mutiny-0.14.0.jar:?]
at io.smallrye.mutiny.operators.uni.builders.DefaultUniEmitter.complete(DefaultUniEmitter.java:36) ~[mutiny-0.14.0.jar:?]
at io.smallrye.mutiny.groups.UniOnNull.lambda$failWith$1(UniOnNull.java:43) ~[mutiny-0.14.0.jar:?]
at io.smallrye.context.impl.wrappers.SlowContextualBiConsumer.accept(SlowContextualBiConsumer.java:21) ~[smallrye-context-propagation-1.1.0.jar:?]
at io.smallrye.mutiny.groups.UniOnItem.lambda$transformToUni$5(UniOnItem.java:281) ~[mutiny-0.14.0.jar:?]
at io.smallrye.context.impl.wrappers.SlowContextualConsumer.accept(SlowContextualConsumer.java:21) ~[smallrye-context-propagation-1.1.0.jar:?]
at io.smallrye.mutiny.operators.uni.builders.UniCreateWithEmitter.subscribe(UniCreateWithEmitter.java:22) ~[mutiny-0.14.0.jar:?]
at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36) ~[mutiny-0.14.0.jar:?]
at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.performInnerSubscription(UniOnItemTransformToUni.java:81) ~[mutiny-0.14.0.jar:?]
at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.onItem(UniOnItemTransformToUni.java:57) ~[mutiny-0.14.0.jar:?]
at io.smallrye.mutiny.operators.uni.UniOperatorProcessor.onItem(UniOperatorProcessor.java:36) ~[mutiny-0.14.0.jar:?]
at io.smallrye.mutiny.operators.uni.builders.UniCreateFromCompletionStage$CompletionStageUniSubscription.forwardResult(UniCreateFromCompletionStage.java:63) ~[mutiny-0.14.0.jar:?]
at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859) ~[?:?]
at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837) ~[?:?]
at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506) ~[?:?]
at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073) ~[?:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.unroll(AsyncTrampoline.java:127) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.lambda$unroll$0(AsyncTrampoline.java:123) ~[asyncutil-0.1.0.jar:?]
at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859) ~[?:?]
at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837) ~[?:?]
at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506) ~[?:?]
at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073) ~[?:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.unroll(AsyncTrampoline.java:127) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.lambda$unroll$0(AsyncTrampoline.java:123) ~[asyncutil-0.1.0.jar:?]
at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859) ~[?:?]
at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837) ~[?:?]
at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506) ~[?:?]
at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073) ~[?:?]
at org.hibernate.reactive.pool.impl.Handlers.lambda$toCompletionStage$0(Handlers.java:26) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at io.vertx.sqlclient.impl.SqlResultHandler.complete(SqlResultHandler.java:98) ~[vertx-sql-client-3.9.5.jar:3.9.5]
at io.vertx.sqlclient.impl.SqlResultHandler.handle(SqlResultHandler.java:87) ~[vertx-sql-client-3.9.5.jar:3.9.5]
at io.vertx.sqlclient.impl.SqlResultHandler.handle(SqlResultHandler.java:33) ~[vertx-sql-client-3.9.5.jar:3.9.5]
at io.vertx.sqlclient.impl.SocketConnectionBase.handleMessage(SocketConnectionBase.java:241) ~[vertx-sql-client-3.9.5.jar:3.9.5]
at io.vertx.sqlclient.impl.SocketConnectionBase.lambda$init$0(SocketConnectionBase.java:88) ~[vertx-sql-client-3.9.5.jar:3.9.5]
at io.vertx.core.net.impl.NetSocketImpl.lambda$new$2(NetSocketImpl.java:101) ~[vertx-core-3.9.5.jar:3.9.5]
at io.vertx.core.streams.impl.InboundBuffer.handleEvent(InboundBuffer.java:237) ~[vertx-core-3.9.5.jar:3.9.5]
at io.vertx.core.streams.impl.InboundBuffer.write(InboundBuffer.java:127) ~[vertx-core-3.9.5.jar:3.9.5]
at io.vertx.core.net.impl.NetSocketImpl.handleMessage(NetSocketImpl.java:357) ~[vertx-core-3.9.5.jar:3.9.5]
at io.vertx.core.impl.ContextImpl.executeTask(ContextImpl.java:366) ~[vertx-core-3.9.5.jar:3.9.5]
at io.vertx.core.impl.EventLoopContext.execute(EventLoopContext.java:43) ~[vertx-core-3.9.5.jar:3.9.5]
at io.vertx.core.impl.ContextImpl.executeFromIO(ContextImpl.java:229) ~[vertx-core-3.9.5.jar:3.9.5]
at io.vertx.core.net.impl.VertxHandler.channelRead(VertxHandler.java:163) ~[vertx-core-3.9.5.jar:3.9.5]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.49.Final.jar:?]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.49.Final.jar:?]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.49.Final.jar:?]
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) ~[netty-transport-4.1.49.Final.jar:?]
at io.vertx.pgclient.impl.codec.PgEncoder.lambda$write$0(PgEncoder.java:78) ~[vertx-pg-client-3.9.5.jar:3.9.5]
at io.vertx.pgclient.impl.codec.PgCommandCodec.handleReadyForQuery(PgCommandCodec.java:138) ~[vertx-pg-client-3.9.5.jar:3.9.5]
at io.vertx.pgclient.impl.codec.PgDecoder.decodeReadyForQuery(PgDecoder.java:226) ~[vertx-pg-client-3.9.5.jar:3.9.5]
at io.vertx.pgclient.impl.codec.PgDecoder.channelRead(PgDecoder.java:86) ~[vertx-pg-client-3.9.5.jar:3.9.5]
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) ~[netty-transport-4.1.49.Final.jar:?]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.49.Final.jar:?]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.49.Final.jar:?]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.49.Final.jar:?]
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-transport-4.1.49.Final.jar:?]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.49.Final.jar:?]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.49.Final.jar:?]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-transport-4.1.49.Final.jar:?]
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) ~[netty-transport-4.1.49.Final.jar:4.1.49.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714) ~[netty-transport-4.1.49.Final.jar:4.1.49.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650) ~[netty-transport-4.1.49.Final.jar:4.1.49.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576) ~[netty-transport-4.1.49.Final.jar:4.1.49.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) ~[netty-transport-4.1.49.Final.jar:4.1.49.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-common-4.1.49.Final.jar:4.1.49.Final]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.49.Final.jar:4.1.49.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.49.Final.jar:4.1.49.Final]
at java.lang.Thread.run(Thread.java:829) [?:?]
Caused by: org.hibernate.HibernateException: javax.persistence.PersistenceException: org.hibernate.HibernateException: java.lang.UnsupportedOperationException
... 87 more
Caused by: javax.persistence.PersistenceException: org.hibernate.HibernateException: java.lang.UnsupportedOperationException
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154) ~[hibernate-core-5.4.29.Final.jar:5.4.29.Final]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) ~[hibernate-core-5.4.29.Final.jar:5.4.29.Final]
at org.hibernate.reactive.session.impl.ReactiveExceptionConverter.convert(ReactiveExceptionConverter.java:31) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.internal.SessionImpl.fireDelete(SessionImpl.java:914) ~[hibernate-core-5.4.29.Final.jar:5.4.29.Final]
at org.hibernate.internal.SessionImpl.removeOrphanBeforeUpdates(SessionImpl.java:880) ~[hibernate-core-5.4.29.Final.jar:5.4.29.Final]
at org.hibernate.reactive.engine.impl.Cascade.cascadeLogicalOneToOneOrphanRemoval(Cascade.java:359) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.engine.impl.Cascade.cascadeProperty(Cascade.java:272) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.engine.impl.Cascade.cascadeInternal(Cascade.java:195) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.engine.impl.Cascade.lambda$cascade$2(Cascade.java:117) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106) ~[?:?]
at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235) ~[?:?]
at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:143) ~[?:?]
at org.hibernate.reactive.engine.impl.Cascade.cascade(Cascade.java:111) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.event.impl.AbstractReactiveFlushingEventListener.cascadeOnFlush(AbstractReactiveFlushingEventListener.java:293) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.event.impl.AbstractReactiveFlushingEventListener.lambda$prepareEntityFlushes$4(AbstractReactiveFlushingEventListener.java:137) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.util.impl.CompletionStages.lambda$loop$5(CompletionStages.java:169) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at com.ibm.asyncutil.iteration.AsyncTrampoline.lambda$asyncWhile$1(AsyncTrampoline.java:209) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.unroll(AsyncTrampoline.java:119) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.trampoline(AsyncTrampoline.java:101) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.access$200(AsyncTrampoline.java:84) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline.asyncWhile(AsyncTrampoline.java:192) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline.asyncWhile(AsyncTrampoline.java:209) ~[asyncutil-0.1.0.jar:?]
at org.hibernate.reactive.util.impl.CompletionStages.loop(CompletionStages.java:169) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.util.impl.CompletionStages.loop(CompletionStages.java:199) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.event.impl.AbstractReactiveFlushingEventListener.prepareEntityFlushes(AbstractReactiveFlushingEventListener.java:134) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.event.impl.AbstractReactiveFlushingEventListener.flushEverythingToExecutions(AbstractReactiveFlushingEventListener.java:96) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.event.impl.DefaultReactiveFlushEventListener.reactiveOnFlush(DefaultReactiveFlushEventListener.java:41) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.lambda$fire$44(ReactiveSessionImpl.java:1066) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106) ~[?:?]
at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235) ~[?:?]
at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:143) ~[?:?]
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.fire(ReactiveSessionImpl.java:1066) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.doFlush(ReactiveSessionImpl.java:872) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
... 80 more
Caused by: org.hibernate.HibernateException: java.lang.UnsupportedOperationException
at org.hibernate.reactive.session.impl.ReactiveExceptionConverter.convert(ReactiveExceptionConverter.java:31) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.internal.SessionImpl.fireDelete(SessionImpl.java:914) ~[hibernate-core-5.4.29.Final.jar:5.4.29.Final]
at org.hibernate.internal.SessionImpl.removeOrphanBeforeUpdates(SessionImpl.java:880) ~[hibernate-core-5.4.29.Final.jar:5.4.29.Final]
at org.hibernate.reactive.engine.impl.Cascade.cascadeLogicalOneToOneOrphanRemoval(Cascade.java:359) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.engine.impl.Cascade.cascadeProperty(Cascade.java:272) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.engine.impl.Cascade.cascadeInternal(Cascade.java:195) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.engine.impl.Cascade.lambda$cascade$2(Cascade.java:117) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106) ~[?:?]
at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235) ~[?:?]
at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:143) ~[?:?]
at org.hibernate.reactive.engine.impl.Cascade.cascade(Cascade.java:111) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.event.impl.AbstractReactiveFlushingEventListener.cascadeOnFlush(AbstractReactiveFlushingEventListener.java:293) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.event.impl.AbstractReactiveFlushingEventListener.lambda$prepareEntityFlushes$4(AbstractReactiveFlushingEventListener.java:137) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.util.impl.CompletionStages.lambda$loop$5(CompletionStages.java:169) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at com.ibm.asyncutil.iteration.AsyncTrampoline.lambda$asyncWhile$1(AsyncTrampoline.java:209) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.unroll(AsyncTrampoline.java:119) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.trampoline(AsyncTrampoline.java:101) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.access$200(AsyncTrampoline.java:84) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline.asyncWhile(AsyncTrampoline.java:192) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline.asyncWhile(AsyncTrampoline.java:209) ~[asyncutil-0.1.0.jar:?]
at org.hibernate.reactive.util.impl.CompletionStages.loop(CompletionStages.java:169) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.util.impl.CompletionStages.loop(CompletionStages.java:199) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.event.impl.AbstractReactiveFlushingEventListener.prepareEntityFlushes(AbstractReactiveFlushingEventListener.java:134) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.event.impl.AbstractReactiveFlushingEventListener.flushEverythingToExecutions(AbstractReactiveFlushingEventListener.java:96) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.event.impl.DefaultReactiveFlushEventListener.reactiveOnFlush(DefaultReactiveFlushEventListener.java:41) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.lambda$fire$44(ReactiveSessionImpl.java:1066) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106) ~[?:?]
at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235) ~[?:?]
at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:143) ~[?:?]
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.fire(ReactiveSessionImpl.java:1066) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.doFlush(ReactiveSessionImpl.java:872) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
... 80 more
Caused by: java.lang.UnsupportedOperationException
at org.hibernate.reactive.event.impl.DefaultReactiveDeleteEventListener.onDelete(DefaultReactiveDeleteEventListener.java:75) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93) ~[hibernate-core-5.4.29.Final.jar:5.4.29.Final]
at org.hibernate.internal.SessionImpl.fireDelete(SessionImpl.java:904) ~[hibernate-core-5.4.29.Final.jar:5.4.29.Final]
at org.hibernate.internal.SessionImpl.removeOrphanBeforeUpdates(SessionImpl.java:880) ~[hibernate-core-5.4.29.Final.jar:5.4.29.Final]
at org.hibernate.reactive.engine.impl.Cascade.cascadeLogicalOneToOneOrphanRemoval(Cascade.java:359) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.engine.impl.Cascade.cascadeProperty(Cascade.java:272) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.engine.impl.Cascade.cascadeInternal(Cascade.java:195) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.engine.impl.Cascade.lambda$cascade$2(Cascade.java:117) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106) ~[?:?]
at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235) ~[?:?]
at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:143) ~[?:?]
at org.hibernate.reactive.engine.impl.Cascade.cascade(Cascade.java:111) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.event.impl.AbstractReactiveFlushingEventListener.cascadeOnFlush(AbstractReactiveFlushingEventListener.java:293) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.event.impl.AbstractReactiveFlushingEventListener.lambda$prepareEntityFlushes$4(AbstractReactiveFlushingEventListener.java:137) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.util.impl.CompletionStages.lambda$loop$5(CompletionStages.java:169) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at com.ibm.asyncutil.iteration.AsyncTrampoline.lambda$asyncWhile$1(AsyncTrampoline.java:209) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.unroll(AsyncTrampoline.java:119) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.trampoline(AsyncTrampoline.java:101) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.access$200(AsyncTrampoline.java:84) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline.asyncWhile(AsyncTrampoline.java:192) ~[asyncutil-0.1.0.jar:?]
at com.ibm.asyncutil.iteration.AsyncTrampoline.asyncWhile(AsyncTrampoline.java:209) ~[asyncutil-0.1.0.jar:?]
at org.hibernate.reactive.util.impl.CompletionStages.loop(CompletionStages.java:169) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.util.impl.CompletionStages.loop(CompletionStages.java:199) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.event.impl.AbstractReactiveFlushingEventListener.prepareEntityFlushes(AbstractReactiveFlushingEventListener.java:134) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.event.impl.AbstractReactiveFlushingEventListener.flushEverythingToExecutions(AbstractReactiveFlushingEventListener.java:96) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.event.impl.DefaultReactiveFlushEventListener.reactiveOnFlush(DefaultReactiveFlushEventListener.java:41) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.lambda$fire$44(ReactiveSessionImpl.java:1066) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106) ~[?:?]
at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235) ~[?:?]
at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:143) ~[?:?]
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.fire(ReactiveSessionImpl.java:1066) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.doFlush(ReactiveSessionImpl.java:872) ~[hibernate-reactive-core-1.0.0.CR1.jar:1.0.0.CR1]
... 80 more
@ApplicationScoped
public class CampaignDao {
public Uni<Campaign> update(final Campaign update) {
final Function<Campaign, Uni<? extends Campaign>> updateFunc = entity -> {
entity.setSchedule(new ExecutionDate().setStart(OffsetDateTime.now()));
return session.flush().onItem().transform(ignore -> entity);
};
return session.find(Campaign.class, update.getId())
.onItem().ifNotNull().transformToUni(updateFunc);
}
}
@Entity
public class Campaign implements Serializable {
@OneToOne(mappedBy = "campaign", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
@JsonIgnore
private Schedule schedule;
// Getters and setters
}
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "schedule_type", discriminatorType = DiscriminatorType.STRING)
public abstract class Schedule implements Serializable {
@Id
@Column(name = "id")
private String id = UUID.randomUUID().toString();
@OneToOne
@JoinColumn(name = "campaign_id")
@JsonIgnore
private Campaign campaign;
// Getters and setters
}
@Entity
@DiscriminatorValue("EXECUTION_DATE")
public class ExecutionDate extends Schedule {
@Column(name = "start_date")
private OffsetDateTime start;
// Getters and setters
}
@blafond Could you start to have a look at this, please?
yes
@DavideD
I've created a test that reproduces the exception occuring because of a deleteReactive(...)
being triggered which removes the joined entity column reference (a new Schedule
) after the setSchedule(...)
flush.
I added a test locally to LazyOneToOneWithJoinColumnTest.java but I did not get an exception.
There are some differences between the 2 Entity sets. The failing test entities include some inheritance.
Added test method to check ORM persistence during setSchedule(....)
. It fails differently by not finding updated entity.
The issue with ORM is that you are updating Campaign but it is detached when you do the changes.
This changes will make everything work:
@Test
public void testUpdateExecutionDateWithORM(TestContext context) {
Session session = ormFactory.openSession();
session.beginTransaction();
Campaign campaign = session.getReference( Campaign.class, theCampaign.getId() );
campaign.setSchedule( new ExecutionDate( OffsetDateTime.now(), "BETA" ) );
session.getTransaction().commit();
session.close();
Stage.Session stageSession = openSession();
test( context, stageSession.find( Campaign.class, campaign.getId() )
.thenAccept( entityFound -> context.assertEquals(
campaign.getSchedule().getCodeName(),
entityFound.getSchedule().getCodeName()
) )
);
}
Even better:
Campaign campaign = session.getReference(theCampaign);
I tried this and -- yes -- the Exception is gone. However, now each update of the Schedule
relation results in a new row in the database.
This is my code:
return session.withTransaction(transaction -> {
final Campaign campaign = session.getReference(Campaign.class, update.getId());
campaign.setSchedule(new ExecutionDate().setStart(OffsetDateTime.now()));
return Uni.createFrom().item(campaign);
});
Is that also reproducable in your test?
I think the original exception indicates a wrong path to delete the Schedule
entity before it inserts the new Schedule
, which also explains multiple rows in database.
Basically I can reproduce your UnsupportedOperationException and it's a bug
@Thomodachi, regarding your question about the repeated inserts. That's probably happening because you are not clearing the session after committing the transaction. So the entities remain attached to the session and Hibernate won't execute the delete queries on Schedule
like it's supposed to.
Once you add the session.clear()
you will see the expected UnsupportedOperation
bug.
But we are working on it, and it should be fixed soon.
@DavideD
pushed a new branch 702-fix with changes to ReactiveSessionImpl and an updated test class.
I included an override to removeOrphanBeforeUpdates(...)
. Includes a private logRemoveOrphanBeforeUpdates(...)
but don't know if we need that logging for reactive?
Thanks @blafond, it seems the fix is not going to be too complex but you need to make sure that the methods you add are reactive, also no need to keep the ORM test.
Once you add the session.clear() you will see the expected UnsupportedOperation bug.
But we are working on it, and it should be fixed soon.
I was actually wrong about this, you don't need the session.clear
but, because this is a bidirectional association, you need to update both sides:
return session.withTransaction(transaction -> {
final Campaign campaign = session.getReference(Campaign.class, update.getId());
campaign.getSchedule().setCampaign(null);
campaign.setSchedule(new ExecutionDate().setStart(OffsetDateTime.now()));
return Uni.createFrom().item(campaign);
});
The way setSchedule
is implemented, it will only add a new schedule without removing the previous one.
Hi @DavideD, do you have a plan when 1.0.0.CR4 will be released? We are waiting for a release containing a fix for this issue, since it didn't quite make it for 1.0.0.CR3.
Soon :-)
We are waiting for the release of ORM 5.4.31.Final