'Error: detached entity passed to persist | method save new is not persisting in the DB | Quarkus | GraphQL | Postgres | Hibernate

I managed to implement the CRUD functions. All are working fine except the addNew (save method). when I execute that add method; I always get the error: "detached entity passed to persist ....." bellow the error log:

     __  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2022-04-20 18:37:57,754 INFO  [org.fly.cor.int.lic.VersionPrinter] (Quarkus Main Thread) Flyway Community Edition 8.4.2 by Redgate
2022-04-20 18:37:57,757 INFO  [org.fly.cor.int.dat.bas.BaseDatabaseType] (Quarkus Main Thread) Database: jdbc:postgresql://localhost:5432/db-mcs-thirdparty (PostgreSQL 14.2)
     2022-04-20 18:37:57,824 INFO  [org.fly.cor.int.com.DbMigrate] (Quarkus Main Thread) Current version of schema "public": 1====--> 90% EXECUTING [13s]
2022-04-20 18:37:57,826 INFO  [org.fly.cor.int.com.DbMigrate] (Quarkus Main Thread) Schema "public" is up to date. No migration necessary.
     2022-04-20 18:37:58,813 INFO  [io.quarkus] (Quarkus Main Thread) back-mcs-thirdparty 1.0.0-SNAPSHOT on JVM (powered by Quarkus 2.7.3.Final) started in 6.704s. Listening on: http://localhost:8080
2022-04-20 18:37:58,813 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2022-04-20 18:37:58,813 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [agroal, cdi, flyway, hibernate-orm, hibernate-orm-panache, jdbc-postgresql, narayana-jta, resteasy-jackson, resteasy-jsonb, smallrye-context-propagation, smallrye-graphql, vertx]
     2022-04-20 18:38:04,408 INFO  [graphqlIssueResource] (vert.x-worker-thread-0) ----------------------------------------2022-04-20 18:40:36,263 ERROR [io.sma.graphql] (vert.x-worker-thread-1) SRGQL012000: Data Fetching Error: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.mami.model.Issue
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
        at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:766)
        at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:746)
        at io.quarkus.hibernate.orm.runtime.session.TransactionScopedSession.persist(TransactionScopedSession.java:140)
        at io.quarkus.hibernate.orm.runtime.session.ForwardingSession.persist(ForwardingSession.java:53)
        at org.hibernate.Session_5b93bee577ae2f8d76647de04cfab36afbf52958_Synthetic_ClientProxy.persist(Unknown Source)
        at io.quarkus.hibernate.orm.panache.common.runtime.AbstractJpaOperations.persist(AbstractJpaOperations.java:99)
        at io.quarkus.hibernate.orm.panache.common.runtime.AbstractJpaOperations.persist(AbstractJpaOperations.java:94)
        at io.quarkus.hibernate.orm.panache.PanacheRepositoryBase.persistAndFlush(PanacheRepositoryBase.java:81)
        at com.mami.repository.IssueRepository_Subclass.persistAndFlush$$superforward1(Unknown Source)
        at com.mami.repository.IssueRepository_Subclass$$function$$50.apply(Unknown Source)
        at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:54)
        at io.quarkus.arc.runtime.devconsole.InvocationInterceptor.proceed(InvocationInterceptor.java:62)
        at io.quarkus.arc.runtime.devconsole.InvocationInterceptor.monitor(InvocationInterceptor.java:49)
        at io.quarkus.arc.runtime.devconsole.InvocationInterceptor_Bean.intercept(Unknown Source)
        at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:41)
        at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:41)
        at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:32)
        at com.mami.repository.IssueRepository_Subclass.persistAndFlush(Unknown Source)
        at com.mami.repository.IssueRepository_ClientProxy.persistAndFlush(Unknown Source)
        at com.mami.service.IssueService.createIssue(IssueService.java:29)
        at com.mami.service.IssueService_Subclass.createIssue$$superforward1(Unknown Source)
        at com.mami.service.IssueService_Subclass$$function$$6.apply(Unknown Source)
        at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:54)
        at io.quarkus.arc.runtime.devconsole.InvocationInterceptor.proceed(InvocationInterceptor.java:62)
        at io.quarkus.arc.runtime.devconsole.InvocationInterceptor.monitor(InvocationInterceptor.java:49)
        at io.quarkus.arc.runtime.devconsole.InvocationInterceptor_Bean.intercept(Unknown Source)
        at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:41)
        at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:41)
        at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:32)
        at com.mami.service.IssueService_Subclass.createIssue(Unknown Source)
        at com.mami.service.IssueService_ClientProxy.createIssue(Unknown Source)
        at com.mami.resource.IssueResource.addIssue(IssueResource.java:48)
        at com.mami.resource.IssueResource_Subclass.addIssue$$superforward1(Unknown Source)
        at com.mami.resource.IssueResource_Subclass$$function$$2.apply(Unknown Source)
        at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:54)
        at io.quarkus.arc.runtime.devconsole.InvocationInterceptor.proceed(InvocationInterceptor.java:62)
        at io.quarkus.arc.runtime.devconsole.InvocationInterceptor.monitor(InvocationInterceptor.java:49)
        at io.quarkus.arc.runtime.devconsole.InvocationInterceptor_Bean.intercept(Unknown Source)
        at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:41)
        at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:50)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:132)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:103)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired.doIntercept(TransactionalInterceptorRequired.java:38)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.intercept(TransactionalInterceptorBase.java:57)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired.intercept(TransactionalInterceptorRequired.java:32)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired_Bean.intercept(Unknown Source)
        at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:41)
        at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:41)
        at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:32)
        at com.mami.resource.IssueResource_Subclass.addIssue(Unknown Source)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at io.smallrye.graphql.execution.datafetcher.helper.ReflectionInvoker.invoke(ReflectionInvoker.java:88)
        at io.smallrye.graphql.execution.datafetcher.DefaultDataFetcher.invokeAndTransform(DefaultDataFetcher.java:37)
        at io.smallrye.graphql.execution.datafetcher.AbstractDataFetcher.get(AbstractDataFetcher.java:53)
        at graphql.execution.instrumentation.dataloader.DataLoaderDispatcherInstrumentation.lambda$instrumentDataFetcher$0(DataLoaderDispatcherInstrumentation.java:87)
        at graphql.execution.ExecutionStrategy.fetchField(ExecutionStrategy.java:279)
        at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:210)
        at graphql.execution.ExecutionStrategy.resolveField(ExecutionStrategy.java:182)
        at graphql.execution.AsyncSerialExecutionStrategy.lambda$execute$1(AsyncSerialExecutionStrategy.java:43)
        at graphql.execution.Async.eachSequentiallyImpl(Async.java:80)
        at graphql.execution.Async.eachSequentially(Async.java:69)
        at graphql.execution.AsyncSerialExecutionStrategy.execute(AsyncSerialExecutionStrategy.java:38)
        at graphql.execution.Execution.executeOperation(Execution.java:159)
        at graphql.execution.Execution.execute(Execution.java:105)
        at graphql.GraphQL.execute(GraphQL.java:613)
        at graphql.GraphQL.parseValidateAndExecute(GraphQL.java:538)
        at graphql.GraphQL.executeAsync(GraphQL.java:502)
        at graphql.GraphQL.execute(GraphQL.java:433)
        at io.smallrye.graphql.execution.ExecutionService.execute(ExecutionService.java:126)
        at io.quarkus.smallrye.graphql.runtime.SmallRyeGraphQLExecutionHandler.doRequest(SmallRyeGraphQLExecutionHandler.java:299)
        at io.quarkus.smallrye.graphql.runtime.SmallRyeGraphQLExecutionHandler.handlePost(SmallRyeGraphQLExecutionHandler.java:113)
        at io.quarkus.smallrye.graphql.runtime.SmallRyeGraphQLExecutionHandler.doHandle(SmallRyeGraphQLExecutionHandler.java:73)
        at io.quarkus.smallrye.graphql.runtime.SmallRyeGraphQLAbstractHandler.handleWithIdentity(SmallRyeGraphQLAbstractHandler.java:66)
        at io.quarkus.smallrye.graphql.runtime.SmallRyeGraphQLAbstractHandler.handle(SmallRyeGraphQLAbstractHandler.java:48)
        at io.quarkus.smallrye.graphql.runtime.SmallRyeGraphQLAbstractHandler.handle(SmallRyeGraphQLAbstractHandler.java:23)
        at io.vertx.ext.web.impl.BlockingHandlerDecorator.lambda$handle$0(BlockingHandlerDecorator.java:48)
        at io.vertx.core.impl.ContextImpl.lambda$null$0(ContextImpl.java:159)
        at io.vertx.core.impl.AbstractContext.dispatch(AbstractContext.java:100)
        at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$1(ContextImpl.java:157)
        at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
        at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
        at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.mami.model.Issue
        at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:120)
        at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:55)
        at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107)
        at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:760)
        ... 88 more

This is the Enity class:

@Entity
@Table(name = "issue")
public class Issue {

    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    @Column(name = "request_id", nullable = false)
    private Long request_id;

    @Column(name = "mideviceidissue")
    private int miDeviceIdIssue;

    @Column(name = "subject")
    private String subject;

    @Column(name = "description")
    private String description;

    @Column(name = "creationtime")
    private String creationTime;

    @Column(name = "status")
    private String status;

    @Column(name = "lastupdate")
    private String lastUpdate;


    public Long getRequest_id() {
        return request_id;
    }

    public void setRequest_id(Long requestId) {
        this.request_id = requestId;
    }

    public int getMiDeviceIdIssue() {
        return miDeviceIdIssue;
    }

    public void setMiDeviceIdIssue(int miDeviceIdIssue) {
        this.miDeviceIdIssue = miDeviceIdIssue;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getCreationTime() {
        return creationTime;
    }

    public void setCreationTime(String creationTime) {
        this.creationTime = creationTime;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getLastUpdate() {
        return lastUpdate;
    }

    public void setLastUpdate(String lastUpdate) {
        this.lastUpdate = lastUpdate;
    }

    public Issue() { }

    public Issue(Long request_id, int miDeviceIdIssue, String subject, String description, String creationTime, String status, String lastUpdate) {
        this.request_id = request_id;
        this.miDeviceIdIssue = miDeviceIdIssue;
        this.subject = subject;
        this.description = description;
        this.creationTime = creationTime;
        this.status = status;
        this.lastUpdate = lastUpdate;
    }

}

The Issue interface:

public interface McsPublicIssueInterface {

    List<Issue> findAllIssues();
    void createIssue(Issue issueToCreate);
    Issue updateIssue(Long request_id, String status, String description);
    boolean removeIssue(Long request_id);

}

The Issue Repository:

import io.quarkus.hibernate.orm.panache.PanacheRepository;

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class IssueRepository implements PanacheRepository<Issue> {

}

The Issue Service:

@ApplicationScoped
public class IssueService implements McsPublicIssueInterface {

    @Inject
    EntityManager entityManager;

    @Inject
    IssueRepository isRepo;


    @Override
    public List<Issue> findAllIssues() {
        return isRepo.listAll();
    }


    @Override
    public void createIssue(Issue issueToCreate) {
        isRepo.persistAndFlush(issueToCreate);
    }


    @Override
    public Issue updateIssue(Long request_id, String status, String description) {
        Issue x = isRepo.findById(request_id);
        x.setDescription(description);
        x.setStatus(status);
        return x;
    }


    @Override
    public boolean removeIssue(Long request_id) {
        return isRepo.deleteById(request_id);
    }

}

The Issue Resource:

@GraphQLApi
public class IssueResource {
    private static final Logger LOG = Logger.getLogger(IssueResource.class);


    @LoggerName("graphqlIssueResource")
    Logger log;

    @Inject
    private IssueRepository issueRepository;

    @Inject
    IssueService issueService;

    @Inject
    CurrentVertxRequest requestIssue;


    @Query("issues")
    @Description("Getting the whole issues")
    public List<Issue> selectAllIssues() {
        log.info("------------------------------------------- HERE IS CALLING TO GET ALL THE ISSUES ------------------");

        return issueService.findAllIssues();
    }


    @Mutation("creatingNewIssue")
    @Transactional
    @Description("Creating a New Issue")
    public Issue addIssue(Issue issueToCreate) {
        issueService.createIssue(issueToCreate);
        return issueToCreate;
    }


    @Mutation("updatingExistingIssue")
    @Transactional
    @Description("Updating Status and Description issue by request_id")
    public Issue updateExistingIssue(@Name("request_id") Long request_id,
                                @Name("status") String status,
                                @Name("description") String description) {
        return issueService.updateIssue(request_id, status, description);
    }


    @Mutation("deletingIssue")
    @Transactional
    @Description("Deleting specific issue by request_id")
    public boolean deletePerson(Long request_id) {
        return issueService.removeIssue(request_id);
    }
}

This is the DB's table: Issue table in DB / pgadmin4

Here how I test that addNew mutation: enter image description here



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source