Hibernate-reactive: La mise à jour de l'entité associée échoue avec UnsupportedOperationException à l'aide de Quarkus

Créé le 12 avr. 2021  ·  15Commentaires  ·  Source: hibernate/hibernate-reactive

Salut, nous sommes confrontés au problème que nous rencontrons dans un java.lang.UnsupportedOperationException en essayant de mettre à jour une entité associée. Nous utilisons hibernate-reactive avec Quarkus. Je sais qu'il y a eu un problème #506 qui aurait dû résoudre ce problème mais cela ne semble pas fonctionner pour nous.

Lorsque vous appelez la méthode CampaignDao#update sans avoir une instance de Schedule associée à un Campaign l'instance Schedule est stockée comme prévu. L'exception se produit après l'appel de cette méthode après qu'une instance Schedule a été associée à un Campaign et persistée.

Je crée ce problème car je n'ai pas trouvé d'exemple d'implémentation dans votre dossier examples . Peut-être pourriez-vous également en inclure un sur la façon de mettre à jour les entités associées.

Trace de la pile

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

Exemple

Méthode pour mettre à jour une entité

<strong i="7">@ApplicationScoped</strong>
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);
    }
}

Campagne

<strong i="11">@Entity</strong>
public class Campaign implements Serializable {

    @OneToOne(mappedBy = "campaign", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    <strong i="12">@JsonIgnore</strong>
    private Schedule schedule;

// Getters and setters

}

Horaire du cours abstrait

<strong i="16">@Entity</strong>
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "schedule_type", discriminatorType = DiscriminatorType.STRING)
public abstract class Schedule implements Serializable {
    <strong i="17">@Id</strong>
    @Column(name = "id")
    private String id = UUID.randomUUID().toString();

    <strong i="18">@OneToOne</strong>
    @JoinColumn(name = "campaign_id")
    <strong i="19">@JsonIgnore</strong>
    private Campaign campaign;

// Getters and setters
}

Date d'éxecution

<strong i="23">@Entity</strong>
@DiscriminatorValue("EXECUTION_DATE")
public class ExecutionDate extends Schedule {

    @Column(name = "start_date")
    private OffsetDateTime start;

// Getters and setters
}

Informations sur l'environnement

  • Version : 1.0.0.CR1
  • Quarkus version 1.13.0.Final
  • PostgreSQL 12.5
bug

Tous les 15 commentaires

@blafond Pourriez-vous commencer à y jeter un œil, s'il vous plaît ?

Oui

@DavidD

J'ai créé un test qui reproduit l'exception survenant en raison du déclenchement d'un deleteReactive(...) qui supprime la référence de colonne d'entité jointe ( a new Schedule ) après le setSchedule(...) .

J'ai ajouté un test localement à LazyOneToOneWithJoinColumnTest.java mais je n'ai pas eu d'exception.

Il existe quelques différences entre les 2 ensembles d'entités. Les entités de test défaillantes incluent un certain héritage.

Ajout d'une méthode de setSchedule(....) . Il échoue différemment en ne trouvant pas l'entité mise à jour.

Le problème avec ORM est que vous mettez à jour Campaign mais qu'il est détaché lorsque vous effectuez les modifications.
Ces changements feront que tout fonctionnera :

    <strong i="7">@Test</strong>
    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()
                ) )
        );
    }

Encore mieux:

Campaign campaign = session.getReference(theCampaign);

J'ai essayé ceci et - oui - l'exception a disparu. Cependant, chaque mise à jour de la relation Schedule génère désormais une nouvelle ligne dans la base de données.

C'est mon 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);
        });

Est-ce également reproductible dans votre test?

Je pense que l'exception d'origine indique un chemin erroné pour supprimer l'entité Schedule avant d'insérer le nouveau Schedule , ce qui explique également plusieurs lignes dans la base de données.

En gros je peux reproduire votre UnsupportedOperationException et c'est un bug

@Thomodachi , concernant votre question sur les insertions répétées. Cela se produit probablement parce que vous n'effacez pas la session après avoir validé la transaction. Ainsi, les entités restent attachées à la session et Hibernate n'exécutera pas les requêtes de suppression sur Schedule comme il est censé le faire.

Une fois que vous avez ajouté le session.clear() vous verrez le bug UnsupportedOperation attendu.
Mais nous y travaillons, et cela devrait être corrigé bientôt.

@DavidD

a poussé une nouvelle branche 702-fix avec des modifications à ReactiveSessionImpl et une classe de test mise à jour.

J'ai inclus une substitution à removeOrphanBeforeUpdates(...) . Comprend un logRemoveOrphanBeforeUpdates(...) privé, mais vous ne savez pas si nous avons besoin de cette journalisation pour réactiver ?

Merci @blafond , il semble que le correctif ne soit pas trop complexe mais vous devez vous assurer que les méthodes que vous ajoutez sont réactives, pas besoin non plus de conserver le test ORM.

Une fois que vous avez ajouté session.clear(), vous verrez le bogue UnsupportedOperation attendu.
Mais nous y travaillons, et cela devrait être corrigé bientôt.

En fait, je me suis trompé à ce sujet, vous n'avez pas besoin du session.clear mais, comme il s'agit d'une association bidirectionnelle, vous devez mettre à jour les deux côtés :

       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);
        });

De la manière dont setSchedule est implémenté, il ajoutera uniquement un nouveau programme sans supprimer le précédent.

Salut @DavideD , avez-vous un plan pour la sortie de la 1.0.0.CR4 ? Nous attendons une version contenant un correctif pour ce problème, car il n'a pas tout à fait été corrigé pour la 1.0.0.CR3.

Bientôt :-)

Nous attendons la sortie d'ORM 5.4.31.Final

Cette page vous a été utile?
0 / 5 - 0 notes