Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Manipulando adequadamente dados longos no Hibernate


Pelo que eu sei, realmente não há como o Hibernate ou o MySQL truncar automaticamente as strings sem que você adicione a lógica para lidar com isso. A razão pela qual eu acreditaria que algo assim não existe é que eu nunca gostaria que o que eu pedi para ser inserido em um banco de dados fosse diferente do que realmente foi inserido.

Acho que suas únicas opções são...

  1. Altere as definições de coluna. Torne-o um campo varchar maior ou talvez até um campo de texto. Não gaste tempo construindo uma ferramenta mágica quando apenas alterar a definição da coluna resolveria isso em alguns cliques. Eu recomendo fazer isso!

  2. Pude ver você usando algum tipo de aspecto para interceptar os setters e, em seguida, ajustando o tamanho da string se for maior que x comprimento. Este seria o motivo mais rápido para lidar com isso em seu código. Se alterar o banco de dados não for uma opção e você tiver milhares de campos, essa seria minha próxima escolha.

  3. Crie um utilitário String classe que pode redimensionar suas strings ...

    setText(String val){this.text =StringUtil.truncate(val,size);}

[ATUALIZAÇÃO] Como você não pode realmente atualizar o banco de dados, eu recomendaria um aspecto para interceptar setters de String e verificar seu comprimento, pode ficar assim (a sintaxe pode estar desativada e eu não testei isso) ...
private static final MAX_SIZE_OF_STRINGS = 255;

@Around("execution(* your.package.*.set*(..)) && args(java.lang.String)")
public void checkAroundSetter(final ProceedingJoinPoint pjp)
    throws Throwable {
    Object[] args = pjp.getArgs();
    for (int i = 0; i < args.length; i++) {
        if (args[i] instanceof String && ((String) args[i]).size() > MAX_SIZE_OF_STRINGS) {
            args[i] = ((String)args[i]).subString(0,MAX_SIZE_OF_STRINGS) ;
        }
    }
    pjp.proceed(args);
}

Além disso, haveria alguma sobrecarga adicional se alguma camada tivesse que verificar o tamanho da coluna definida em relação a todos os dados que chegam à tabela em cada inserção.