merging a @ManyToOne association can call non-reactive code
See original GitHub issueHi, I need to update ‘erp_campus_id’ in ‘erp_academic_year_detail’ table. The same code will works If I used normal hibernate. But In hibernate-reactive it throws an exception. I am using 1.0.0.CR9 version.
AcademicYearDetaisDBO dbo = sessionFactory.withSession(session -> session.createQuery("select dbo from AcademicYearDetaisDBO dbo where dbo.id=386",AcademicYearDetaisDBO.class).getSingleResult()).await().indefinitely();
dbo.setRecordStatus('A');
System.out.println(dbo.getCampusId().getId());//for example here campus id is 11
CampusDBO campusDBO = new CampusDBO();
campusDBO.setId(5);
dbo.setCampusId(campusDBO); // need to update as 5
sessionFactory.withTransaction((session, transaction) -> session.merge(dbo)).await().indefinitely(); // here it will throw an exception
@Getter
@Setter
@Entity
@Table(name = "erp_academic_year_detail")
public class AcademicYearDetaisDBO implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "erp_academic_year_detail_id")
private Integer id;
@ManyToOne
@JoinColumn(name = "erp_campus_id")
private CampusDBO campusId;
@Column(name = "record_status")
private char recordStatus;
@Column(name = "created_users_id")
private Integer createdUsersId;
@Column(name = "modified_users_id")
private Integer modifiedUsersId;
}
@Entity
@Getter
@Setter
@Table(name="erp_campus")
public class CampusDBO implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="erp_campus_id")
private Integer id;
@Column(name="campus_name")
private String campusName;
}
Exception:
javax.persistence.PersistenceException: org.hibernate.HibernateException: java.util.concurrent.CompletionException: org.hibernate.reactive.event.impl.UnexpectedAccessToTheDatabase: Unexpected access to the database
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154) ~[hibernate-core-5.5.7.Final.jar:5.5.7.Final]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) ~[hibernate-core-5.5.7.Final.jar:5.5.7.Final]
at org.hibernate.reactive.session.impl.ReactiveExceptionConverter.convert(ReactiveExceptionConverter.java:31) ~[hibernate-reactive-core-1.0.0.CR9.jar:1.0.0.CR9]
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.lambda$fireMerge$28(ReactiveSessionImpl.java:842) ~[hibernate-reactive-core-1.0.0.CR9.jar:1.0.0.CR9]
at java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:836) ~[na:1.8.0_301]
at java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:811) ~[na:1.8.0_301]
at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:488) ~[na:1.8.0_301]
at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:1975) ~[na:1.8.0_301]
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.unroll(AsyncTrampoline.java:127) ~[asyncutil-0.1.0.jar:na]
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.lambda$unroll$0(AsyncTrampoline.java:123) ~[asyncutil-0.1.0.jar:na]
at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:774) ~[na:1.8.0_301]
at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:750) ~[na:1.8.0_301]
at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:488) ~[na:1.8.0_301]
at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:1975) ~[na:1.8.0_301]
at io.vertx.core.Future.lambda$toCompletionStage$2(Future.java:360) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:124) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:62) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:179) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.PromiseImpl.tryComplete(PromiseImpl.java:23) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.sqlclient.impl.QueryResultBuilder.tryComplete(QueryResultBuilder.java:102) ~[vertx-sql-client-4.1.2.jar:4.1.2]
at io.vertx.sqlclient.impl.QueryResultBuilder.tryComplete(QueryResultBuilder.java:35) ~[vertx-sql-client-4.1.2.jar:4.1.2]
at io.vertx.core.Promise.complete(Promise.java:66) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.Promise.handle(Promise.java:51) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.Promise.handle(Promise.java:29) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:124) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:62) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:179) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.PromiseImpl.tryComplete(PromiseImpl.java:23) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.PromiseImpl.onSuccess(PromiseImpl.java:49) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.PromiseImpl.handle(PromiseImpl.java:41) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.sqlclient.impl.TransactionImpl.lambda$wrap$0(TransactionImpl.java:72) ~[vertx-sql-client-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:124) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:62) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:179) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.PromiseImpl.tryComplete(PromiseImpl.java:23) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.PromiseImpl.onSuccess(PromiseImpl.java:49) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.PromiseImpl.handle(PromiseImpl.java:41) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.future.PromiseImpl.handle(PromiseImpl.java:23) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.sqlclient.impl.command.CommandResponse.fire(CommandResponse.java:46) ~[vertx-sql-client-4.1.2.jar:4.1.2]
at io.vertx.sqlclient.impl.SocketConnectionBase.handleMessage(SocketConnectionBase.java:279) ~[vertx-sql-client-4.1.2.jar:4.1.2]
at io.vertx.sqlclient.impl.SocketConnectionBase.lambda$init$0(SocketConnectionBase.java:98) ~[vertx-sql-client-4.1.2.jar:4.1.2]
at io.vertx.core.net.impl.NetSocketImpl.lambda$new$1(NetSocketImpl.java:97) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.streams.impl.InboundBuffer.handleEvent(InboundBuffer.java:240) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.streams.impl.InboundBuffer.write(InboundBuffer.java:130) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.net.impl.NetSocketImpl.lambda$handleMessage$9(NetSocketImpl.java:390) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.EventLoopContext.emit(EventLoopContext.java:49) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.ContextImpl.emit(ContextImpl.java:275) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.impl.EventLoopContext.emit(EventLoopContext.java:22) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.net.impl.NetSocketImpl.handleMessage(NetSocketImpl.java:389) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.net.impl.ConnectionBase.read(ConnectionBase.java:155) ~[vertx-core-4.1.2.jar:4.1.2]
at io.vertx.core.net.impl.VertxHandler.channelRead(VertxHandler.java:154) ~[vertx-core-4.1.2.jar:4.1.2]
Caused by: java.util.concurrent.CompletionException: org.hibernate.reactive.event.impl.UnexpectedAccessToTheDatabase: Unexpected access to the database
at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273) ~[na:1.8.0_301]
at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280) ~[na:1.8.0_301]
at java.util.concurrent.CompletableFuture.uniAccept(CompletableFuture.java:673) ~[na:1.8.0_301]
at java.util.concurrent.CompletableFuture.uniAcceptStage(CompletableFuture.java:683) ~[na:1.8.0_301]
at java.util.concurrent.CompletableFuture.thenAccept(CompletableFuture.java:2010) ~[na:1.8.0_301]
at java.util.concurrent.CompletableFuture.thenAccept(CompletableFuture.java:110) ~[na:1.8.0_301]
at org.hibernate.reactive.event.impl.DefaultReactiveMergeEventListener.fetchAndCopyValues(DefaultReactiveMergeEventListener.java:484) ~[hibernate-reactive-core-1.0.0.CR9.jar:1.0.0.CR9]
at org.hibernate.reactive.event.impl.DefaultReactiveMergeEventListener.lambda$null$8(DefaultReactiveMergeEventListener.java:348) ~[hibernate-reactive-core-1.0.0.CR9.jar:1.0.0.CR9]
at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:995) ~[na:1.8.0_301]
at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2137) ~[na:1.8.0_301]
at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:110) ~[na:1.8.0_301]
at org.hibernate.reactive.event.impl.DefaultReactiveMergeEventListener.lambda$entityIsDetached$10(DefaultReactiveMergeEventListener.java:348) ~[hibernate-reactive-core-1.0.0.CR9.jar:1.0.0.CR9]
at java.util.concurrent.CompletableFuture.uniCompose(CompletableFuture.java:966) ~[na:1.8.0_301]
at java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:940) ~[na:1.8.0_301]
... 78 common frames omitted
Caused by: org.hibernate.reactive.event.impl.UnexpectedAccessToTheDatabase: Unexpected access to the database
at org.hibernate.reactive.event.impl.DefaultReactiveLoadEventListener.onLoad(DefaultReactiveLoadEventListener.java:107) ~[hibernate-reactive-core-1.0.0.CR9.jar:1.0.0.CR9]
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:118) ~[hibernate-core-5.5.7.Final.jar:5.5.7.Final]
at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1215) ~[hibernate-core-5.5.7.Final.jar:5.5.7.Final]
at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1080) ~[hibernate-core-5.5.7.Final.jar:5.5.7.Final]
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:697) ~[hibernate-core-5.5.7.Final.jar:5.5.7.Final]
at org.hibernate.type.EntityType.resolve(EntityType.java:464) ~[hibernate-core-5.5.7.Final.jar:5.5.7.Final]
at org.hibernate.type.ManyToOneType.resolve(ManyToOneType.java:240) ~[hibernate-core-5.5.7.Final.jar:5.5.7.Final]
at org.hibernate.type.EntityType.resolve(EntityType.java:457) ~[hibernate-core-5.5.7.Final.jar:5.5.7.Final]
at org.hibernate.type.EntityType.replace(EntityType.java:358) ~[hibernate-core-5.5.7.Final.jar:5.5.7.Final]
at org.hibernate.type.TypeHelper.replace(TypeHelper.java:167) ~[hibernate-core-5.5.7.Final.jar:5.5.7.Final]
at org.hibernate.reactive.event.impl.DefaultReactiveMergeEventListener.copyValues(DefaultReactiveMergeEventListener.java:493) ~[hibernate-reactive-core-1.0.0.CR9.jar:1.0.0.CR9]
at org.hibernate.reactive.event.impl.DefaultReactiveMergeEventListener.lambda$fetchAndCopyValues$14(DefaultReactiveMergeEventListener.java:484) ~[hibernate-reactive-core-1.0.0.CR9.jar:1.0.0.CR9]
at java.util.concurrent.CompletableFuture.uniAccept(CompletableFuture.java:670) ~[na:1.8.0_301]
Issue Analytics
- State:
- Created 2 years ago
- Comments:8 (6 by maintainers)
Top Results From Across the Web
merging a @ManyToOne association can call non-reactive code
it might by trying to determine if the object is "saved" or "unsaved", or; perhaps it's trying to obtain a snapshot of the...
Read more >Best Practices for Many-To-One and One-To-Many ...
The mapping of associations with JPA and Hibernate seems to be easier than it is. Here are several pitfalls and best practices to...
Read more >1.0.0.CR10 Milestone - GitHub
#980 by DavideD was merged on Sep 29, 2021 • Approved ... merging a @ManyToOne association can call non-reactive code bug Something isn't ......
Read more >Merging a managed entity on the @ManyToOne side
Calling merge on the employee(1L) instance will do nothing as the name change is already visible, but it will casacade to the department....
Read more >spring-projects/spring-data - Gitter
I can call InterfaceB default method and primary implementation on an instance of TestEntityRepository. @Repository public interface TestEntityRepository
Read more >
Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free
Top Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
THanks @nivinps, I’m checking
OK @gavinking. Thank you once again.