question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

merging a @ManyToOne association can call non-reactive code

See original GitHub issue

Hi, 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:closed
  • Created 2 years ago
  • Comments:8 (6 by maintainers)

github_iconTop GitHub Comments

1reaction
DavideDcommented, Sep 3, 2021

THanks @nivinps, I’m checking

0reactions
nivinpscommented, Sep 5, 2021

What you’re doing right now might work, at least if you’re careful, but it’s not how this API is intended to be used.

OK @gavinking. Thank you once again.

Read more comments on GitHub >

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

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found