Menu

Error de duplicado UNIQUE KEY

Manu
2024-05-28
2024-05-30
  • Manu

    Manu - 2024-05-28

    Buenos días!

    Me salta este error de duplicado cuando una clave unique y required esta ya introducida "uk_8l18dnkhmv7ou2w52ke7e8co". Y me gustaría que fuera un mensaje más descriptivo para los usuarios, he intentado mirar los messages de errores de github de Openxava y no veo ninguno especifico.

    Con este mensaje por consola:

    GRAVE: org.hibernate.exception.ConstraintViolationException: could not execute statement
    javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
        at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:762)
        at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:742)
        at org.openxava.actions.SaveAction.create(SaveAction.java:77)
        at org.openxava.actions.SaveAction.execute(SaveAction.java:27)
        at org.openxava.controller.ModuleManager.executeAction(ModuleManager.java:560)
        at org.openxava.controller.ModuleManager.executeAction(ModuleManager.java:492)
        at org.openxava.web.dwr.Module.getURIAsStream(Module.java:275)
        at org.openxava.web.dwr.Module.request(Module.java:60)
        ...
    Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
        at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59)
        ... 
    Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'Y7986587N ' for key 'UK_8l18dnkhmv7ou2w52ke7e8co0'
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:117)
        ... 
    

    Estaba intentando acotar el error, pero no se si hacerlo en el validador del DNI o NIE de mi clase "Propietario", o en mi clase de grabar, había hecho esto, pero no funciona, me da el mismo error.

    public class Grabar  extends SaveAction {
      public void execute() throws Exception {
    
        super.execute();
        if (getErrors().contains("unique")) {
            getErrors().remove("unique");
            addError("Comprueba que el DNI/NIE/CIF/PASAPORTE no este duplicado.");
        }
        setNextMode(LIST); 
      }
    }
    

    Y mi clase abreviada donde valido el "documento" es:

    ~~~
    public class Propietario{
    @Column(unique=true, length=15) @Required
    String documento;

    @PrePersist @PreUpdate // Antes de crear o modificar
    private void validar() throws Exception {
        switch (tipo.toString()) {
          case "NIE":
              if (validarNIE(documento) == false) {
                    throw new javax.validation.ValidationException(
                        XavaResources.getString( 
                            "nie_debe_ser_correcto")
                    );
              }
            break;
        }
      }
    

    public static boolean validarNIE(String nie) {

        boolean esValido = false;
        int i = 1;
        int caracterASCII = 0;
        char letra = ' ';
        int miNIE = 0;
        int resto = 0;
        char[] asignacionLetra = {'T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X','B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E'};
    
    
        if(nie.length() == 9 && Character.isLetter(nie.charAt(8))
            && nie.substring(0,1).toUpperCase().equals("X")
            || nie.substring(0,1).toUpperCase().equals("Y")
            || nie.substring(0,1).toUpperCase().equals("Z")) {
    
            do {
                caracterASCII = nie.codePointAt(i);
                esValido = (caracterASCII > 47 && caracterASCII < 58);
                i++;
            } while(i < nie.length() - 1 && esValido);
        }
    
        if(esValido && nie.substring(0,1).toUpperCase().equals("X")) {
            nie = "0" + nie.substring(1,9);
        } else if(esValido && nie.substring(0,1).toUpperCase().equals("Y")) {
            nie = "1" + nie.substring(1,9);
        } else if(esValido && nie.substring(0,1).toUpperCase().equals("Z")) {
            nie = "2" + nie.substring(1,9);
        }
    
        if(esValido) {
            letra = Character.toUpperCase(nie.charAt(8));
            miNIE = Integer.parseInt(nie.substring(0,8));
            resto = miNIE % 23;
            esValido = (letra == asignacionLetra[resto]);
        }
    
        return esValido;
    }
    ~~~
    
     

Log in to post a comment.