Spring数据JPA-javax.persistence.TransactionRequiredException:执行更新/删除查询

Spring数据JPA-javax.persistence.TransactionRequiredException:执行更新/删除查询,java,spring,spring-boot,spring-data-jpa,spring-data,Java,Spring,Spring Boot,Spring Data Jpa,Spring Data,我正在尝试使用Spring Crudepository类更新表(@query annotation)。 但系统在更新时抛出以下错误。我在谷歌上搜索过,发现很多线程都在通知添加事务性注释。我做了,但没有效果。有人能帮我一下吗 import java.util.ArrayList; import java.util.List; import org.springframework.data.jpa.repository.Modifying; import org.springframework.d

我正在尝试使用Spring Crudepository类更新表(@query annotation)。 但系统在更新时抛出以下错误。我在谷歌上搜索过,发现很多线程都在通知添加事务性注释。我做了,但没有效果。有人能帮我一下吗

import java.util.ArrayList;
import java.util.List;

import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.Transactional;

    @Repository
    public interface PrintJobItemRepo extends CrudRepository<PrintJobItem, Integer> {

        @Modifying     
        @Query(value =  PrintBatchConstants.UPDATE_SEQUENCE_NUMBER_QUERY)
        public void updateSequenceNumberInPrintItemTable(String sequenceNumber, String groupId);    
    }

    public class PrintBatchConstants {

        public static final String UPDATE_SEQUENCE_NUMBER_QUERY="UPDATE PRINT_JOB_ITEM SET PRINT_STATUS=null,SEQUENCE_NBR=(?1) "
                                                                 + "where GROUP_ID=(?2) and sequence_nbr is null";

    }

@Transactional注释作为Spring方面工作,这意味着Spring使用注释方法(和代理方法)创建类的代理,因此在运行时,对该方法的调用将定向到代理方法,代理方法将对事务中的实际方法的调用封装

在代码中,从存储库中删除@Transactional:

public interface PrintJobItemRepo extends CrudRepository<PrintJobItem, Integer> {

    @Modifying     
    @Query(value =  PrintBatchConstants.UPDATE_SEQUENCE_NUMBER_QUERY)
    public void updateSequenceNumberInPrintItemTable(String sequenceNumber, String groupId);
}
公共接口PrintJobItemRepo扩展了Crudepository{
@修改
@查询(值=PrintBatchConstants.UPDATE\u SEQUENCE\u NUMBER\u查询)
public void updateSequenceEnumberInPrintitemTable(String sequenceNumber,String groupId);
}
我也删除了@EnableTransactionManagement,将它放在带有@Configuration注解的bean中,或者与@SpringBootApplication放在同一个类中

接下来,将@Transactional放入进行更新调用的方法中:

@Transactional
public void updateSequenceNumbers(List<String> groupIds) {

    logger.info("Enter -> updateSequenceNumber");

    int groupNosSize=groupIds.size();

    StringBuilder sequenceNbr=null;

    for (int i = 0; i < groupIds.size(); i++) {
            sequenceNbr=new StringBuilder();
            sequenceNbr.append(i+1);
            sequenceNbr.append(" Of ");
            sequenceNbr.append(groupNosSize);


            pjr.updateSequenceNumberInPrintItemTable(sequenceNbr.toString(),groupIds.get(i));
    }

    logger.info("Completed -> updateSequenceNumber");

}
@Transactional
public void updateSequenceEnumbers(列出组ID){
info(“输入->更新序列号”);
int groupNosSize=groupIds.size();
StringBuilder sequenceNbr=null;
对于(int i=0;i更新序列号”);
}

让我知道它是否有效。

在PrintJobItemRepo上尝试
@Transactional
,而不是在方法级别应用它

    @Repository
    @Transactional
    public interface PrintJobItemRepo extends CrudRepository<PrintJobItem, Integer> 
@存储库
@交易的
公共接口PrintJobItemRepo扩展了Crudepository

就我而言。。。。将@Transactional方法放在Spring的上下文中,而不是放在Spring的外部

我认为您需要在类上添加注释“EndUserTransaction”。另外,还有一些变体,参见docsHi Adrian,我在文档中找不到任何这样的注释。我想我已经添加了所需的注释,但是这里缺少了一些其他内容。很抱歉,关于注释,您是对的。这是一个自定义注释…yikes.你能分享消费类吗?嗨,Adrian,我已经添加了消费类。请查查你好卡洛斯·哈维尔,谢谢你的解释。我已经用你的建议更新了我原来的帖子。我试过了,但它仍然抛出相同的错误,没有区别。请告诉我。你能告诉我所有的异常stacktrace吗?你好,卡洛斯·哈维尔,我已经添加了完整的异常stacktrace。请检查。你把@EnableTransactionManagement注释放在哪里了?嗨,CarlosJavier,我已经在我的jar入口点类中添加了@EnableTransactionManagement,springboot应用程序就是在这里初始化的。
public interface PrintJobItemRepo extends CrudRepository<PrintJobItem, Integer> {

    @Modifying     
    @Query(value =  PrintBatchConstants.UPDATE_SEQUENCE_NUMBER_QUERY)
    public void updateSequenceNumberInPrintItemTable(String sequenceNumber, String groupId);
}
@Transactional
public void updateSequenceNumbers(List<String> groupIds) {

    logger.info("Enter -> updateSequenceNumber");

    int groupNosSize=groupIds.size();

    StringBuilder sequenceNbr=null;

    for (int i = 0; i < groupIds.size(); i++) {
            sequenceNbr=new StringBuilder();
            sequenceNbr.append(i+1);
            sequenceNbr.append(" Of ");
            sequenceNbr.append(groupNosSize);


            pjr.updateSequenceNumberInPrintItemTable(sequenceNbr.toString(),groupIds.get(i));
    }

    logger.info("Completed -> updateSequenceNumber");

}
    @Repository
    @Transactional
    public interface PrintJobItemRepo extends CrudRepository<PrintJobItem, Integer>