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