Hibernate-reactive: 使用 Quarkus 更新关联实体失败并显示 UnsupportedOperationException

创建于 2021-04-12  ·  15评论  ·  资料来源: hibernate/hibernate-reactive

嗨,我们面临的问题是在尝试更新关联实体时遇到java.lang.UnsupportedOperationException 。 我们在 Quarkus 中使用 hibernate-reactive。 我知道有一个问题 #506 应该可以解决这个问题,但它似乎对我们不起作用。

当调用CampaignDao#update方法,而无需实例Schedule与相关联的CampaignSchedule实例获取存储按预期方式。 在Schedule实例与Campaign关联并持久化之后调用该方法后发生异常。

我正在创建这个问题,因为我在您的examples文件夹中找不到示例实现。 也许您还可以包含一个关于如何更新关联实体的内容。

堆栈跟踪

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

例子

更新实体的方法

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

活动

<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

}

抽象课时间表

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

执行日期

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

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

// Getters and setters
}

环境信息

  • 版本:1.0.0.CR1
  • Quarkus 版本 1.13.0.Final
  • PostgreSQL 12.5

所有15条评论

@blafond你能开始看看这个吗?

是的

@戴维德

我创建了一个测试来重现由于deleteReactive(...)被触发而发生的异常,它在setSchedule(...)刷新后删除了连接的实体列引用( a new Schedule )。

我在本地向LazyOneToOneWithJoinColumnTest.java添加了一个测试,但没有出现异常。

2 个实体集之间存在一些差异。 失败的测试实体包括一些继承。

添加了在setSchedule(....)期间检查 ORM 持久性的测试方法。 由于找不到更新的实体,它以不同的方式失败。

ORM 的问题在于您正在更新 Campaign,但在您进行更改时它已分离。
此更改将使一切正常:

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

更好的是:

Campaign campaign = session.getReference(theCampaign);

我试过这个 - 是的 - 异常消失了。 但是,现在Schedule关系的每次更新都会在数据库中产生一个新行。

这是我的代码:

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

这在您的测试中也可重现吗?

我认为原始异常表明在插入新的Schedule之前删除Schedule实体的错误路径,这也解释了数据库中的多行。

基本上我可以重现您的UnsupportedOperationException ,这是一个错误

@Thomodachi ,关于您关于重复插入的问题。 这可能是因为您在提交事务后没有清除会话。 因此,实体仍然连接到会话,并且 Hibernate 不会像预期的那样在Schedule上执行删除查询。

添加session.clear()您将看到预期的UnsupportedOperation错误。
但我们正在努力,应该很快就会修复。

@戴维德

推送了一个新的分支702-fix,其中包含对 ReactiveSessionImpl 的更改和更新的测试类。

我包含了对removeOrphanBeforeUpdates(...)的覆盖。 包括一个私有的logRemoveOrphanBeforeUpdates(...)但不知道我们是否需要该日志记录来进行响应?

谢谢@blafond ,看来修复不会太复杂,但您需要确保添加的方法是反应性的,也不需要保留 ORM 测试。

添加 session.clear() 后,您将看到预期的 UnsupportedOperation 错误。
但我们正在努力,应该很快就会修复。

我实际上错了,你不需要session.clear但是,因为这是一个双向关联,你需要更新双方:

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

setSchedule的实现方式,它只会添加一个新的计划而不删除之前的计划。

@DavideD ,你有什么时候发布 1.0.0.CR4 的计划吗? 我们正在等待包含此问题修复程序的版本,因为它并没有完全适用于 1.0.0.CR3。

很快 :-)

我们正在等待 ORM 5.4.31.Final 的发布

此页面是否有帮助?
0 / 5 - 0 等级