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

标签 java spring transactions spring-data

我有一个 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 模式打开时,我都没有收到任何错误。但是该对象也不会被删除。调用删除方法后它仍然在数据库中。当我创建一个名为 deleteById 的自定义 Spring 存储库方法时,出现以下错误:

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 +
                '}';
    }
}

有谁知道什么可能导致此错误?

如有任何帮助,我们将不胜感激。

最佳答案

所有 Controller 方法都应该是非事务性的。 您应该在 Controller 和 Repository(Service 层)之间再添加一层,并将 @Transactional 放在 Service 类上,或者将此注释放在该 Service 类中的方法上。

应该是 Controller -> 服务 -> 存储库

要让@Transactional工作,您应该初始化TransactionalManager。 您可以在持久性配置

中添加类似的内容
@Bean
public JpaTransactionManager transactionManager() throws IOException {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
    return transactionManager;
}

关于java - 当我尝试删除对象时,我的 Spring jpaRepository 抛出 TransactionRequiredException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47549043/

相关文章:

java - 如何使用 ResultSet JDBC 更新包含连接的 Select 字段

java - 如何获取 href 中的 2 个参数 - Spring MVC?

java - Tomcat 类路径没有改变

mysql - 交易在 Yii 中不起作用

java - java中构建器类的正确命名

java - spullara mustache java 偏音

java - 使用 HibernateTransactionManager 作为 jdbc 模板

java - 我是否必须关闭 JdbcTemplate 连接和手动创建的语句?

oracle - 如何查看任意 oracle session 使用的事务隔离级别

asp.net - 如何使用 Asp.Net 从 Sql 数据库获取最后创建的条目的 ID