Hibernate est mise à jour automatique de mon entité, même si une erreur s'est produite entre

0

La question

J'ai une entité du nom de "Programme". Je suis en train de faire une opération avec cette entité. Mais je ne sais pas comment, ni pourquoi, mon entité est mis à jour même je reçois exception. Si quelqu'un peut m'aider à résoudre ce problème.

Contrôleur

@GetMapping("/testtransaction/{tid}")
public ApiResponse testTransaction(@PathVariable("tid") String tid){
     return gsService.testTransaction(tid);
}

Service

@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
public ApiResponse testTransaction(String tid) {
    ApiResponse apiResponse = new ApiResponse();
    try {
        Optional<Program> existProgram = programRepository.findById(tid);
        if(existProgram.isPresent()) {
            //For testing I am setting random value
            existProgram.get().setProgramName("tid_"+(Math.floor(Math.random() * 90 + 10)));
                
            try {
                int err = 8/0;
            }catch(Exception e) {
                throw new EntityNotFoundException(Program.class, "prog cd", tid);
            }
                    
            programRepository.save(existProgram.get());
            apiResponse.setData("Success");
        }else {
            apiResponse.setError("Program details not found for "+tid);
            apiResponse.setStatusCode(500);
        }
    }catch(Exception e) {
        apiResponse.setError("Something went wrong while testing.");
        apiResponse.setStatusCode(500);
        return apiResponse;
    }
    return apiResponse;
}

Entité

package com.edudb.model;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.Size;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Entity
@JsonInclude(value=Include.NON_NULL)
@Table(name = "PROGRAM_MASTER")
public class Program {
    @Id
    @Column(name = "PROGRAM_CD")
    private String programCd;
    
    @Column(name = "PROGRAM_NAME")
    @Size(min=1, max=100, message = "Minimum 1 & maximum 100 characters only")
    private String programName;
    
    @Column(name="ENT_BY")
    @Size(min=1, max=12, message = "Minimum 1 & maximum 12 characters only")
    private String entBy;
    
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="dd MMM yyyy")  
    @Column(name = "ENT_DT")
    @Temporal(TemporalType.DATE)
    private Date entDt;
    
    @Column(name="DEL_BY")
    @Size(min=1, max=12, message = "Minimum 1 & maximum 12 characters only")
    private String delBy;
    
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="dd MMM yyyy")  
    @Column(name = "DEL_DT")
    @Temporal(TemporalType.DATE)
    private Date delDt;
    
    @Column(name="LAST_UPDT_BY")
    @Size(min=1, max=12, message = "Minimum 1 & maximum 12 characters only")
    private String updtBy;
    
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="dd MMM yyyy")  
    @Column(name = "LAST_UPDT_DT")
    @Temporal(TemporalType.DATE)
    private Date updtDt;
}

Réponse ce que je suis en facteur

{
    "statusCode": 500,
    "error": "Something went wrong while testing."
}

Printemps journal de démarrage

2021-11-23 10:34:20 DEBUG --- origin:null
 : com.datanet.filter.SimpleCorsFilter     2021-11-23 10:34:20 DEBUG --- 
    select
        program0_.program_cd as program_cd1_83_0_,
        program0_.del_by as del_by2_83_0_,
        program0_.del_dt as del_dt3_83_0_,
        program0_.ent_by as ent_by4_83_0_,
        program0_.ent_dt as ent_dt5_83_0_,
        program0_.program_name as program_name6_83_0_,
        program0_.last_updt_by as last_updt_by7_83_0_,
        program0_.last_updt_dt as last_updt_dt8_83_0_ 
    from
        program_master program0_ 
    where
        program0_.program_cd=?
 : org.hibernate.SQL                       2021-11-23 10:34:20 TRACE --- binding parameter [1] as [VARCHAR] - [demo]
 : ibernate.type.descriptor.sql.BasicBinder2021-11-23 10:34:20 DEBUG --- 
    update
        program_master 
    set
        del_by=?,
        del_dt=?,
        ent_by=?,
        ent_dt=?,
        program_name=?,
        last_updt_by=?,
        last_updt_dt=? 
    where
        program_cd=?
 : org.hibernate.SQL                       2021-11-23 10:34:20 TRACE --- binding parameter [1] as [VARCHAR] - [john]
 : ibernate.type.descriptor.sql.BasicBinder2021-11-23 10:34:20 TRACE --- binding parameter [2] as [DATE] - [2021-10-06]
 : ibernate.type.descriptor.sql.BasicBinder2021-11-23 10:34:20 TRACE --- binding parameter [3] as [VARCHAR] - [peter]
 : ibernate.type.descriptor.sql.BasicBinder2021-11-23 10:34:20 TRACE --- binding parameter [4] as [DATE] - [2021-10-06]
 : ibernate.type.descriptor.sql.BasicBinder2021-11-23 10:34:20 TRACE --- binding parameter [5] as [VARCHAR] - [tid_52.0]
 : ibernate.type.descriptor.sql.BasicBinder2021-11-23 10:34:20 TRACE --- binding parameter [6] as [VARCHAR] - [john]
 : ibernate.type.descriptor.sql.BasicBinder2021-11-23 10:34:20 TRACE --- binding parameter [7] as [DATE] - [2021-10-06]
 : ibernate.type.descriptor.sql.BasicBinder2021-11-23 10:34:20 TRACE --- binding parameter [8] as [VARCHAR] - [demo]
 : ibernate.type.descriptor.sql.BasicBinder

Donc si quelqu'un a été confronté à ce problème auparavant, peut s'il vous plaît m'aider à résoudre ce problème :(

hibernate jpa rollback spring-boot
2021-11-23 05:18:34
1

La meilleure réponse

0

Par l'ajout de lignes de code suivantes dans le catch ou, enfin, ou à la fin de fucntion, hibernate restauration de l'ensemble de la transaction.

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
2021-11-23 07:10:15

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................