Hibernate-reactive: La actualización de la entidad asociada falla con UnsupportedOperationException usando Quarkus

Creado en 12 abr. 2021  ·  15Comentarios  ·  Fuente: hibernate/hibernate-reactive

Hola, nos enfrentamos al problema de que nos encontramos con un java.lang.UnsupportedOperationException al intentar actualizar una entidad asociada. Estamos usando reactivo de hibernación con Quarkus. Sé que ha habido un problema # 506 que debería haber solucionado ese problema, pero no parece funcionar para nosotros.

Cuando se llama al método CampaignDao#update sin tener una instancia de Schedule asociada con una Campaign la instancia Schedule se almacena como se esperaba. La excepción ocurre después de llamar a ese método después de que una instancia Schedule se haya asociado con una Campaign y persista.

Estoy creando este problema porque no pude encontrar una implementación de ejemplo en su carpeta examples . Quizás también podría incluir uno sobre cómo actualizar las entidades asociadas.

Stacktrace

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

Ejemplo

Método para actualizar una entidad

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

Campaña

<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

}

Horario de clases abstractas

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

Fecha de ejecución

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

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

// Getters and setters
}

Información medioambiental

  • Versión: 1.0.0.CR1
  • Quarkus versión 1.13.0.Final
  • PostgreSQL 12.5
bug

Todos 15 comentarios

@blafond ¿Podrías empezar a echarle un vistazo a esto, por favor?

@DavideD

He creado una prueba que reproduce la excepción que se produce debido a que se activa un deleteReactive(...) que elimina la referencia de columna de entidad unida ( a new Schedule ) después de setSchedule(...) flush.

Agregué una prueba localmente a

Existen algunas diferencias entre los 2 conjuntos de entidades. Las entidades de prueba que fallan incluyen algo de herencia.

Se agregó un método de prueba para verificar la persistencia de ORM durante setSchedule(....) . Falla de manera diferente al no encontrar una entidad actualizada.

El problema con ORM es que está actualizando Campaign, pero se desconecta cuando realiza los cambios.
Estos cambios harán que todo funcione:

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

Aun mejor:

Campaign campaign = session.getReference(theCampaign);

Probé esto y, sí, la excepción se ha ido. Sin embargo, ahora cada actualización de la relación Schedule da como resultado una nueva fila en la base de datos.

Este es mi codigo:

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

¿Eso también es reproducible en su prueba?

Creo que la excepción original indica una ruta incorrecta para eliminar la entidad Schedule antes de que inserte el nuevo Schedule , que también explica varias filas en la base de datos.

Básicamente puedo reproducir su UnsupportedOperationException y es un error

@Thomodachi , con respecto a su pregunta sobre las inserciones repetidas. Probablemente eso esté sucediendo porque no está limpiando la sesión después de confirmar la transacción. Entonces, las entidades permanecen adjuntas a la sesión e Hibernate no ejecutará las consultas de eliminación en Schedule como se supone que debe hacerlo.

Una vez que agregue el session.clear() , verá el error UnsupportedOperation esperado.
Pero estamos trabajando en ello y debería solucionarse pronto.

@DavideD

impulsó una nueva rama 702-fix con cambios en ReactiveSessionImpl y una clase de prueba actualizada.

Incluí una anulación de removeOrphanBeforeUpdates(...) . Incluye un logRemoveOrphanBeforeUpdates(...) privado, pero ¿no sabe si necesitamos ese registro para reactivo?

Gracias @blafond , parece que la solución no será demasiado compleja, pero debe asegurarse de que los métodos que agregue sean reactivos, y tampoco es necesario mantener la prueba ORM.

Una vez que agregue session.clear (), verá el error esperado de UnsupportedOperation.
Pero estamos trabajando en ello y debería solucionarse pronto.

De hecho, me equivoqué al respecto, no necesita session.clear pero, debido a que esta es una asociación bidireccional, debe actualizar ambos lados:

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

La forma en que se implementa setSchedule , solo agregará un nuevo horario sin eliminar el anterior.

Hola @DavideD , ¿tienes un plan para el lanzamiento de 1.0.0.CR4? Estamos esperando una versión que contenga una solución para este problema, ya que no llegó a la versión 1.0.0.CR3.

Pronto :-)

Estamos esperando el lanzamiento de ORM 5.4.31.Final

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

tsegismont picture tsegismont  ·  9Comentarios

tsegismont picture tsegismont  ·  20Comentarios

gavinking picture gavinking  ·  16Comentarios

gavinking picture gavinking  ·  23Comentarios

yaakov-berkovitch picture yaakov-berkovitch  ·  16Comentarios