无法使用 Spring 更新实体

问题描述 投票:0回答:1

我在 springboot 的这个异常中遇到了一些麻烦: Association 实例的标识符从 Association@42c3ddac 更改为 Association@5f8c91f9。

我真的不明白为什么会出现此异常,因为我只是在使用此方法更改非键属性时保存对象:

@PutMapping("/accept")
    public ResponseEntity<SoumissionDto> setAssociationToAccepted(@RequestBody AssociationDto associationDto) {
        try {
            Canvas canvas = canvasService.getCanvasByCodeInvitation(associationDto.getCodeInvitation());
            Canvas canvasSoumis = canvasService.getCanvasById(associationDto.getGuidcanvasIndividuel());
            Association updatedAssociation = associationService.getAssociationByCanvasCollabAndCanvas(canvas.getGUIDCanvas(), canvasSoumis.getGUIDCanvas());
            if (updatedAssociation == null) {
                return new ResponseEntity<>(HttpStatus.NOT_FOUND);
            } else {
                System.out.println("j'ai eu cette asso id :  "+ updatedAssociation.getCanvas().getGUIDCanvas().toString() +"  id collab  " + updatedAssociation.getCanvasEquipe().getGUIDCanvas().toString());
                updatedAssociation.setStatut(true);
                
Association returnAssociation = associationService.updateAssociation(updatedAssociation);
                SoumissionDto soumissionDto = createSoumissionDtoFromAssociation(returnAssociation);
                return new ResponseEntity<>(soumissionDto, HttpStatus.OK);
            }
        } catch (Exception e) {
            System.out.println("J'ai une erreur : "+e.getMessage());
            System.out.println("stack : "+ Arrays.toString(e.getStackTrace()));
            System.out.println("cause : "+e.getCause());

            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

这里是 POJO 协会:

@Entity
@Table(name = "Association")
@IdClass(Association.class)
public class Association {

    @Id
    @ManyToOne
    @JoinColumn(name = "canvas_collectif", nullable = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JsonBackReference
    private Canvas canvas_collectif;

    @Id
    @ManyToOne
    @JoinColumn(name = "canvas", nullable = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JsonBackReference
    private Canvas canvas;


    @Column(name = "statut", nullable = false, length = 200)
    private boolean statut;
//with the usual getter and setter
}

在我的数据库中,关联使用由canvas id和canvas_collaboratifId组成的键,并具有布尔属性名称statut。

通过这种方法,我的目标是将statut属性更改为true

我不明白为什么我无法保存我的关联,因为我什至没有触及 ids...

感谢您的宝贵时间 祝大家有美好的一天

编辑 1:这是堆栈跟踪:

org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:321),
org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:233),
org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:566),
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:743),
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:711),
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:654),
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:407),
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119),
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184),
org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137),
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184),
org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:163),
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184),
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97),
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184),
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:218),
jdk.proxy4/jdk.proxy4.$Proxy125.save(Unknown Source),
com.cogiteo.canvas.entitiescontroller.association.service.AssociationService.updateAssociation(AssociationService.java:33),
com.cogiteo.canvas.entitiescontroller.association.controller.AssociationController.setAssociationToAccepted(AssociationController.java:84),
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77),
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
java.base/java.lang.reflect.Method.invoke(Method.java:568),
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207),
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152),
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117),
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884),
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797),
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87),
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1080),
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:973),
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003),
org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:917),
jakarta.servlet.http.HttpServlet.service(HttpServlet.java:734),
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:880),
jakarta.servlet.http.HttpServlet.service(HttpServlet.java:814),
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223),
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158),
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53),
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185),
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158),
org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100),
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116),
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185),
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158),
org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93),
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116),
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185),
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158),
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201),
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116),
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185),
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158),
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197),
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97),
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542),
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119),
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92),
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78),
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357),
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400),
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65),
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861),
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1739),
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52),
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191),
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659),
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61),
java.base/java.lang.Thread.run(Thread.java:833)
java spring-boot spring-data-jpa spring-data
1个回答
0
投票

好的,我找到了解决方案, 由于我使用的是复合键,因此我需要创建一个实现 Serialized 的类 Association_PK 并在 Association 中声明它。 以下是课程:

package com.cogiteo.canvas.entities;

import java.io.Serializable;

public class Association_PK implements Serializable {
    private long canvas_collectif;
    private long canvas;

    public Association_PK() {
    }

    public Association_PK(long canvas_collectif, long canvas) {
        this.canvas_collectif = canvas_collectif;
        this.canvas = canvas;
    }
}

以及更新后的协会:

package com.cogiteo.canvas.entities;

import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;

import com.fasterxml.jackson.annotation.JsonBackReference;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.IdClass;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;


@Entity
@Table(name = "Association")
@IdClass(Association_PK.class)
public class Association {

    @Id
    @ManyToOne
    @JoinColumn(name = "canvas_collectif", nullable = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JsonBackReference
    private Canvas canvas_collectif;

    @Id
    @ManyToOne
    @JoinColumn(name = "canvas", nullable = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JsonBackReference
    private Canvas canvas;


    @Column(name = "statut", nullable = false, length = 200)
    private boolean statut;


    public Canvas getCanvas() {
        return canvas;
    }

    public void setCanvas(Canvas canvas) {
        this.canvas = canvas;
    }

    public boolean getStatut() {
        return statut;
    }

    public void setStatut(boolean statut) {
        this.statut = statut;
    }

    public Canvas getCanvasEquipe() {
        return canvas_collectif;
    }

    public void setCanvasEquipe(Canvas canvas) {
        this.canvas_collectif = canvas;
    }
}

感谢大家的宝贵时间! 祝你有美好的一天!

© www.soinside.com 2019 - 2024. All rights reserved.