Spring 我不知道';我不知道为什么InalidDataAccessApiUsageException

Spring 我不知道';我不知道为什么InalidDataAccessApiUsageException,spring,spring-boot,spring-data-jpa,Spring,Spring Boot,Spring Data Jpa,jpa 错误描述 org.springframework.dao.InvalidDataAccessApiUsageException:执行更新/删除查询;嵌套异常是javax.persistence.TransactionRequiredException:执行更新/删除查询 在org.springframework.orm.jpa.EntityManagerFactoryUtils.ConvertJPAAccessExceptionIffailable(EntityManagerFactor

jpa

错误描述

org.springframework.dao.InvalidDataAccessApiUsageException:执行更新/删除查询;嵌套异常是javax.persistence.TransactionRequiredException:执行更新/删除查询 在org.springframework.orm.jpa.EntityManagerFactoryUtils.ConvertJPAAccessExceptionIffailable(EntityManagerFactoryUtils.java:403)上 如果可能,请访问org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateException(HibernateJpaDialect.java:257) 位于org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.TranslateExceptionIffailable(AbstractEntityManagerFactoryBean.java:528) 在org.springframework.dao.support.ChainedPersistenceExceptionTranslator.TranslateExceptionIfEnabled(ChainedPersistenceExceptionTranslator.java:61) 位于org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242) 位于org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153) 位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:186) 位于org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:149) 位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:186) 位于org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95) 位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:186) 位于org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) 位于com.sun.proxy.$Proxy164.updateReturnEquipment(未知来源) 位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 位于java.base/java.lang.reflect.Method.invoke(Method.java:567) 位于org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) 位于org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:205) 位于com.sun.proxy.$Proxy103.updateReturnEquipment(未知来源) 在com.services.webservice.service.MemberService.EquipService.EquipService.saveEquipReturnLogQuery(EquipService.java:72)上 在com.services.webservice.service.MemberService.EquipService.EquipService.equipReturn(EquipService.java:63)上 位于com.services.webservice.domain.EquipServiceTest.equipReturnTest(EquipServiceTest.java:85) 位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 位于java.base/java.lang.reflect.Method.invoke(Method.java:567) 位于org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686) 位于org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115) 位于org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:170) 位于org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40) 位于org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:166) 位于org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:113) 位于org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:58) 位于org.junit.platform.engine.support.hierarchy.NodeTestTask.lambda$ExecuteCursive$5(NodeTestTask.java:135) 位于org.junit.platform.engine.support.hierarchy.ThrowableCollector.execute(ThrowableCollector.java:73) 位于org.junit.platform.engine.support.hierarchy.NodeTestTask.lambda$executecurively$7(NodeTestTask.java:125) 位于org.junit.platform.engine.support.hierarchy.Node.around(Node.java:135) 位于org.junit.platform.engine.support.hierarchy.NodeTestTask.lambda$ExecuteCursive$8(NodeTestTask.java:123) 位于org.junit.platform.engine.support.hierarchy.ThrowableCollector.execute(ThrowableCollector.java:73) 在org.junit.platform.engine.support.hierarchy.NodeTestTask.ExecuteCursive上(NodeTestTask.java:122) 位于org.junit.platform.engine.support.hierarchy.NodeTestTask.execute(NodeTestTask.java:80) 位于java.base/java.util.ArrayList.forEach(ArrayList.java:1540) 位于org.junit.platform.engine.support.hierarchy.samethreadherarchycalTestExecutorService.invokeAll(samethreadherarchycalTestExecutorService.java:38) 位于org.junit.platform.engine.support.hierarchy.NodeTestTask.lambda$ExecuteCursive$5(NodeTestTask.java:139) 位于org.junit.platform.engine.support.hierarchy.ThrowableCollector.execute(ThrowableCollector.java:73) 位于org.junit.platform.engine.support.hierarchy.NodeTestTask.lambda$executecurively$7(NodeTestTask.java:125) 位于org.junit.platform.engine.support.hierarchy.Node.around(Node.java:135) 位于org.junit.platform.engine.support.hierarchy.NodeTestTask.lambda$ExecuteCursive$8(NodeTestTask.java:123) 位于org.junit.platform.engine.support.hierarchy.ThrowableCollector.execute(ThrowableCollector.java:73) 在org.junit.platform.engine.support.hierarchy.NodeTestTask.ExecuteCursive上(NodeTestTask.java:122) 位于org.junit.platform.engine.support.hierarchy.NodeTestTask.execute(NodeTestTask.java:80) 位于java.base/java.util.ArrayList.forEach(ArrayList.java:1540) 在org.junit.platform.eng
public interface EquipRentalLogRepository extends JpaRepository<EquipRentalLog, Long> {
    @Modifying
    @Query("Update EquipRentalLog p set p.realReturnTime = :realReturnTime "
            + "where p.memberId = :member "
            + "and p.equipId = :equipment "
            + "and p.realReturnTime = null")
    void updateReturnEquip(@Param("member") Member member, @Param("equipment") Equipment equipment, @Param("realReturnTime") LocalDateTime realReturnTime);
package com.services.webservice.service.MemberService.EquipService;

import java.util.List;
import java.util.stream.Collectors;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.services.webservice.domain.EState;
import com.services.webservice.domain.Equipment.EquipStateRepository;
import com.services.webservice.domain.Equipment.EquipmentRepository;
import com.services.webservice.domain.Member.MemberRepository;
import com.services.webservice.domain.RentalLog.EquipRentalLogRepository;
import com.services.webservice.service.dto.Equip.Request.ReqEquipRentalDto;
import com.services.webservice.service.dto.Equip.Request.ReqEquipReturnDto;
import com.services.webservice.service.dto.Equip.Response.ResEquipListDto;
import com.services.webservice.service.dto.Equip.Save.SaveEquipRentalDto;

import lombok.AllArgsConstructor;

public void equipReturn(ReqEquipReturnDto dto) throws NullPointerException{
        saveEquipReturnLogQuery(dto);
    }

    @Transactional
    private void saveEquipReturnLogQuery(ReqEquipReturnDto dto)throws NullPointerException {
        EquipRentalLog log = equipLogRepo.findbyMemberRentalSameEquip(dto.getStudentNum(), dto.getEquipNum()).get(0);

        System.out.println(log.getReason());

        equipLogRepo.updateReturnEquip(memberRepo.findByStudentNum(dto.getStudentNum()), 
                        equipRepo.findByEquipNum(dto.getEquipNum()), 
                        dto.getRealReturnTime());

        equipRepo.updatebyRentalEquip(dto.getEquipNum(), equipStateRepo.findByState(EState.ACTIVATE.getValue()));
    }