当我尝试删除对象时,我的 Spring jpaRepository 抛出 TransactionRequiredException

2023-12-28

我有一个 RESTcontroller,它有一个删除映射,如下所示:

    @DeleteMapping("/deleterequest/{custId}")
    //@Transactional
    public ResponseEntity<?> delete(@PathVariable long custId) {
        log.info("entering deleterequest");
        LeaveQuery deleteLeaveQuery = leaveQueryRepository.findOne(custId);
        log.info("condition" + deleteLeaveQuery.getStatus().equals("Onbehandeld"));
//        if (!deleteLeaveQuery.getStatus().equals("Onbehandeld"))
//            return ResponseEntity.badRequest().build();
        //deleteLeaveQuery.setAccount(null);
        //leaveQueryRepository.save(deleteLeaveQuery);
        log.info("is deleteLeaveQuery null? " + (deleteLeaveQuery == null));

        //leaveQueryRepository.delete(deleteLeaveQuery);
        //leaveQueryRepository.delete(deleteLeaveQuery.getId());
        leaveQueryRepository.deleteById(deleteLeaveQuery.getId());
            accountService.sendLeaveRequestCanceledNotification(deleteLeaveQuery);
        return ResponseEntity.ok().build();
    }

当我使用leaveQueryRepository 的常规(内置)删除功能时,无论是在日志INFO 模式下还是在日志DEBUG 模式打开时,我都没有收到错误。但是该对象也不会被删除。调用删除方法后它仍然在数据库中。当我创建一个名为的自定义 spring 存储库方法时deleteById我收到以下错误:

org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call
        at 

我不知道是什么导致了这个错误。 jparepository 看起来像这样:

@Repository
public interface LeaveQueryRepository extends JpaRepository<LeaveQuery, Long> {
    //@Modifying
    public void deleteById(long id);
}

LeaveRequest 对象如下所示:

@Entity
@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id",
        scope = LeaveQuery.class)
public class LeaveQuery implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    private Date startDate;
    private Date endDate;
    private String status = "Onbehandeld";
    private String reason ="";
    private int totalHours;
    private String processedBy;

    @ManyToOne(fetch = FetchType.EAGER) //, cascade = CascadeType.PERSIST
    @JoinColumn(name = "FK_account", nullable = true)
    private Account account;

    public String getProcessedBy() {
        return processedBy;
    }

    public void setProcessedBy(String processedBy) {
        this.processedBy = processedBy;
    }

    public int getTotalHours() {
        return totalHours;
    }

    public void setTotalHours(int totalHours) {
        this.totalHours = totalHours;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Date getStartDate() {
        return startDate;
    }

    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }

    public Date getEndDate() {
        return endDate;
    }

    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }

    public String getStatus() {
        return status;
    }

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

    @Override
    public String toString() {
        return "LeaveQuery{" +
                "id=" + id +
                ", startDate=" + startDate +
                ", endDate=" + endDate +
                ", denialReason='" + reason + '\'' +
                '}';
    }
}

它与 Account 对象有一个关系,如下所示:

@Entity
//@JsonIgnoreProperties
//@JsonIdentityInfo(
//        generator = ObjectIdGenerators.PropertyGenerator.class,
//        property = "id",
//        scope = Account.class)
public class Account implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    private String username;
    private String password;
    private String name;
    private boolean admin;
    private boolean enabled;
    private int remainingStatutoryLeaveHours = 240;
    private int remainingNonStatutoryLeaveHours = 60;

    @JsonIgnore
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "account", cascade = CascadeType.ALL)
    List<LeaveQuery> leaveQueryList;
//

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "account", cascade = CascadeType.ALL)
    List<LaborPeriod> laborperiods = new ArrayList<>();

    @OneToOne
    private Person person;

    @Enumerated
    UserRole userRole = UserRole.USER;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public UserRole getUserRole() {
        return userRole;
    }

    public void setUserRole(UserRole userRole) {
        this.userRole = userRole;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public boolean isAdmin() {
        return admin;
    }

    public void setAdmin(boolean admin) {
        this.admin = admin;
    }

    public List<LaborPeriod> getLaborperiods() {
        return laborperiods;
    }

    public void setLaborperiods(List<LaborPeriod> laborperiods) {
        this.laborperiods = laborperiods;
    }

    public List<LeaveQuery> getLeaveQueryList() {
        return leaveQueryList;
    }

    public void setLeaveQueryList(List<LeaveQuery> leaveQueryList) {
        this.leaveQueryList = leaveQueryList;
    }

    public int getRemainingStatutoryLeaveHours() {
        return remainingStatutoryLeaveHours;
    }

    public void setRemainingStatutoryLeaveHours(int remainingStatutoryLeaveHours) {
        this.remainingStatutoryLeaveHours = remainingStatutoryLeaveHours;
    }

    public int getRemainingNonStatutoryLeaveHours() {
        return remainingNonStatutoryLeaveHours;
    }

    public void setRemainingNonStatutoryLeaveHours(int remainingNonStatutoryLeaveHours) {
        this.remainingNonStatutoryLeaveHours = remainingNonStatutoryLeaveHours;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", name='" + name + '\'' +
                ", admin=" + admin +
                ", enabled=" + enabled +
                ", remainingStatutoryLeaveHours=" + remainingStatutoryLeaveHours +
                ", remainingNonStatutoryLeaveHours=" + remainingNonStatutoryLeaveHours +
                ", userRole=" + userRole +
                '}';
    }
}

有谁知道可能导致此错误的原因是什么?

任何帮助,将不胜感激。


所有控制器方法都应该是非事务性的。 您应该在控制器和存储库(服务层)之间再添加一层并放置@事务性放在 Service 类上,或者将此注释放在该 Service 类中的方法上。

应该是控制器 -> 服务 -> 存储库

To let @事务性你应该初始化的工作事务管理器。 您可以在您的持久化配置

@Bean
public JpaTransactionManager transactionManager() throws IOException {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
    return transactionManager;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我尝试删除对象时,我的 Spring jpaRepository 抛出 TransactionRequiredException 的相关文章

  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐