2021年1月27日星期三

Spring boot call delete method not work in some conditions

I have CurrentTerminalStatus entity like this:

@Entity  @Table(name = "current_terminal_status")  public class CurrentTerminalStatus extends DateAudit {    @JsonIgnore  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  @ApiModelProperty(notes = "The database generated CurrentTerminalStatus ID.")  private Long id;    @Column(name = "current_terminal_global_status_ok")  @NotNull(message = "currentTerminalGlobalStatusOK cannot be null.")  @ApiModelProperty(notes = "currentTerminalGlobalStatusOK for the CurrentTerminalStatus.", required = true)  private boolean currentTerminalGlobalStatusOK;    @OneToMany(cascade = CascadeType.ALL,  fetch = FetchType.LAZY,  mappedBy = "currentTerminalStatus", orphanRemoval = false)  @OnDelete(action = OnDeleteAction.CASCADE)  private Set<CurrentTerminalErrors> errors;    @OneToMany(cascade = CascadeType.ALL,  fetch = FetchType.LAZY,  mappedBy = "currentTerminalStatus", orphanRemoval = false)  @OnDelete(action = OnDeleteAction.CASCADE)  private Set<CurrentTerminalWarnings> warnings;    ........    getter/setter    }  

CurrentTerminalErrors is:

@Entity  @Table(name = "current_terminal_errors")  public class CurrentTerminalErrors {  @JsonIgnore  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  @ApiModelProperty(notes = "The database generated CurrentTerminalErrors ID.")  private Long id;    @NotNull(message = "errorNumber cannot be null.")  @ApiModelProperty(notes = "errorNumber is the number of the error.", required = true)  @Column(name = "error_number", nullable = false)  private Integer errorNumber;    @NotBlank(message = "errorName cannot be missing or empty.Please define errorName.")  @ApiModelProperty(notes = "errorName is the description of the error.", required = true)  @Column(name = "error_name", nullable = false)  private String errorName;    @NotBlank(message = "errorDescription cannot be missing or empty.Please define errorDescription.")  @ApiModelProperty(notes = "errorDescription is the description of the error.", required = true)  @Column(name = "error_description", nullable = false)  private String errorDescription;    @NotBlank(message = "errorActions cannot be missing or empty.Please define errorActions.")  @ApiModelProperty(notes = "errorActions is the actions for the error.", required = true)  @Column(name = "error_actions", nullable = false)  private String errorActions;    @JsonIgnore  @ManyToOne(fetch = FetchType.LAZY, optional = false)  @JoinColumn(name = "current_terminal_status_id", nullable = false)  @OnDelete(action = OnDeleteAction.CASCADE)  private CurrentTerminalStatus currentTerminalStatus;    ......    getter/setter    }  

CurrentTerminalWarnings:

@Entity  @Table(name = "current_terminal_warnings")  public class CurrentTerminalWarnings {    @JsonIgnore  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  @ApiModelProperty(notes = "The database generated CurrentTerminalWarnings ID.")  private Long id;    @NotNull(message = "warningNumber cannot be null.")  @ApiModelProperty(notes = "warningNumber is the number of the warning.", required = true)  @Column(name = "warning_number", nullable = false)  private Integer warningNumber;    @NotBlank(message = "warningName cannot be missing or empty.Please define warningName.")  @ApiModelProperty(notes = "warningName is the name of the warning.", required = true)  @Column(name = "warning_name", nullable = false)  private String warningName;    @NotBlank(message = "warningDescription cannot be missing or empty.Please define warningDescription.")  @ApiModelProperty(notes = "warningDescription is the description of the warning.", required = true)  @Column(name = "warning_description", nullable = false)  private String warningDescription;    @NotBlank(message = "warningActions cannot be missing or empty.Please define warningActions.")  @ApiModelProperty(notes = "warningActions is the actions for the warning.", required = true)  @Column(name = "warning_actions", nullable = false)  private String warningActions;    @JsonIgnore  @ManyToOne(fetch = FetchType.LAZY, optional = false)  @JoinColumn(name = "current_terminal_status_id", nullable = false)  @OnDelete(action = OnDeleteAction.CASCADE)  private CurrentTerminalStatus currentTerminalStatus;    ......    getter/setter    }  

My controller:

public ResponseEntity<?> setCurrentTerminalStatus(final HttpServletRequest request,  @NotNull @Valid @RequestBody final UpdateCurrentTerminalStatusRequest updateCurrentTerminalStatusRequest) {  final String token = request.getHeader("Authorization").split(" ")[1];  final User userFromAccessToken = this.tokenProvider.getUserFromToken(token);  final CurrentTerminalStatus currentTerminalStatus = userFromAccessToken.getCurrentTerminalStatus();  final Set<CurrentTerminalErrors> errors = currentTerminalStatus.getErrors(); //this is for testing  final Set<CurrentTerminalWarnings> warnings = currentTerminalStatus.getWarnings(); //this is for testing  if (currentTerminalStatus.isCurrentTerminalGlobalStatusOK() != updateCurrentTerminalStatusRequest.getCurrentTerminalGlobalStatusOK()){  sendNotification = currentTerminalStatus.isCurrentTerminalGlobalStatusOK() && !updateCurrentTerminalStatusRequest.getCurrentTerminalGlobalStatusOK();  }else{  sendNotification = compareTwoSets(warnings, warnings); //for testing  }  this.currentTerminalErrorsService.deleteCurrentTerminalErrorsByCurrentTerminalStatusId(currentTerminalStatus.getId());  //delete all terminal errors  this.currentTerminalWarningsService.deleteCurrentTerminalWarningsByCurrentTerminalStatusId(currentTerminalStatus.getId()); //delete all terminal warnings  currentTerminalStatus.setCurrentTerminalGlobalStatusOK(updateCurrentTerminalStatusRequest.getCurrentTerminalGlobalStatusOK());  final Set<CurrentTerminalErrors> errorsTerminal = new HashSet<>();  final Set<CurrentTerminalWarnings> warningsTerminal = new HashSet<>();  for (final CurrentTerminalErrors deviceErrors : updateCurrentTerminalStatusRequest.getErrors()) {  errorsTerminal.add(deviceErrors);  deviceErrors.setCurrentTerminalStatus(currentTerminalStatus);  this.currentTerminalErrorsService.saveCurrentTerminalErrors(deviceErrors);  }  for (final CurrentTerminalWarnings deviceWarnings : updateCurrentTerminalStatusRequest.getWarnings()) {  warningsTerminal.add(deviceWarnings);  deviceWarnings.setCurrentTerminalStatus(currentTerminalStatus);  this.currentTerminalWarningsService.saveCurrentTerminalWarnings(deviceWarnings);  }  currentTerminalStatus.setErrors(errorsTerminal);  currentTerminalStatus.setWarnings(warningsTerminal);  final User userUpdated = this.userService.saveUser(userFromAccessToken);  //za da gi zemam aktivnite uredi za da gi imam pri prakanje na notifikacija  userUpdated.getTerminalActiveDevices().size();  //send notification on currentTerminalGlobalStatusOK = false  //if (sendNotification) {  //notificationService.sendEmailNotificationForCurrentTerminalStatus(userUpdated);  //}  return ResponseEntity.ok(userUpdated.getCurrentTerminalStatus());  }  

Response log:

28-01-2021 04:15:14.326 [http-nio-5000-exec-5] DEBUG org.hibernate.SQL.logStatement - delete from current_terminal_errors where id=?  28-01-2021 04:15:14.327 [http-nio-5000-exec-5] DEBUG org.hibernate.SQL.logStatement - delete from current_terminal_errors where id=?  28-01-2021 04:15:14.328 [http-nio-5000-exec-5] DEBUG org.hibernate.SQL.logStatement - delete from current_terminal_errors where id=?  28-01-2021 04:15:14.329 [http-nio-5000-exec-5] DEBUG org.hibernate.SQL.logStatement - delete from current_terminal_errors where id=?  28-01-2021 04:15:14.329 [http-nio-5000-exec-5] DEBUG org.hibernate.SQL.logStatement - delete from current_terminal_warnings where id=?  28-01-2021 04:15:14.329 [http-nio-5000-exec-5] DEBUG org.hibernate.SQL.logStatement - delete from current_terminal_warnings where id=?  28-01-2021 04:15:14.330 [http-nio-5000-exec-5] DEBUG org.hibernate.SQL.logStatement - delete from current_terminal_warnings where id=?  28-01-2021 04:15:14.330 [http-nio-5000-exec-5] DEBUG org.hibernate.SQL.logStatement - delete from current_terminal_warnings where id=?  

This is ok and all errors and warnings is delete but when I use errors in the compareTwoSets (get errors from the terminal status) I get only delete warnings

Response log:

28-01-2021 04:18:28.381 [http-nio-5000-exec-3] DEBUG org.hibernate.SQL.logStatement - delete from current_terminal_warnings where id=?  28-01-2021 04:18:28.385 [http-nio-5000-exec-3] DEBUG org.hibernate.SQL.logStatement - delete from current_terminal_warnings where id=?  28-01-2021 04:18:28.386 [http-nio-5000-exec-3] DEBUG org.hibernate.SQL.logStatement - delete from current_terminal_warnings where id=?  28-01-2021 04:18:28.387 [http-nio-5000-exec-3] DEBUG org.hibernate.SQL.logStatement - delete from current_terminal_warnings where id=?  

If I rotate this line

this.currentTerminalErrorsService.deleteCurrentTerminalErrorsByCurrentTerminalStatusId(currentTerminalStatus.getId());  //delete all terminal errors          this.currentTerminalWarningsService.deleteCurrentTerminalWarningsByCurrentTerminalStatusId(currentTerminalStatus.getId()); //delete all terminal warnings  

like

this.currentTerminalWarningsService.deleteCurrentTerminalWarningsByCurrentTerminalStatusId(currentTerminalStatus.getId()); //delete all terminal warnings    this.currentTerminalErrorsService.deleteCurrentTerminalErrorsByCurrentTerminalStatusId(currentTerminalStatus.getId());  //delete all terminal errors  

only errors are deleted

Response log:

28-01-2021 04:20:29.190 [http-nio-5000-exec-1] DEBUG org.hibernate.SQL.logStatement - delete from current_terminal_errors where id=?  28-01-2021 04:20:29.191 [http-nio-5000-exec-1] DEBUG org.hibernate.SQL.logStatement - delete from current_terminal_errors where id=?  28-01-2021 04:20:29.191 [http-nio-5000-exec-1] DEBUG org.hibernate.SQL.logStatement - delete from current_terminal_errors where id=?  28-01-2021 04:20:29.192 [http-nio-5000-exec-1] DEBUG org.hibernate.SQL.logStatement - delete from current_terminal_errors where id=?  

Insert is working but delete method is call but not execute.(Only first delete)

This happen when I get errors from terminalStatus.

Why is this happen?

When I not use errors all is working fine.

Please help me.

Thanks for all your help

Solution:

This 2 line

this.currentTerminalErrorsService.deleteCurrentTerminalErrorsByCurrentTerminalStatusId(currentTerminalStatus.getId());          this.currentTerminalWarningsService.deleteCurrentTerminalWarningsByCurrentTerminalStatusId(currentTerminalStatus.getId());  

is before getErrors and getWarnings and all is working fine.

https://stackoverflow.com/questions/65930605/spring-boot-call-delete-method-not-work-in-some-conditions January 28, 2021 at 11:25AM

没有评论:

发表评论