Diferencia entre @Size, @Length y @Column(longitud=valor) cuando se usa JPA e Hibernate

2 minutos de lectura

avatar de usuario
cris311

¿Cuál es la diferencia entre la verificación de validación de los siguientes tres campos?

@Entity
public class MyEntity {

    @Column(name = "MY_FIELD_1", length=13)
    private String myField1;
    @Column(name = "MY_FIELD_2")
    @Size(min = 13, max = 13)
    private String myField2;
    @Column(name = "MY_FIELD_3")
    @Length(min = 13, max = 13)
    private String myField3;

    // getter & setter

}

Leí que el primero tiene que ver con cosas de DDL. El segundo es para la validación de frijoles. El tercero es para la validación de hibernación.

¿Es eso correcto? Lo que sigo sin entender es: ¿Cuándo tengo que usar cuál? ¿Cuándo se activa una de estas anotaciones?

Editar: Piense en la siguiente situación: dado el requisito de desarrollar una entidad con un campo de tipo cadena con una longitud de 13. ¿Cuál de los métodos mencionados anteriormente elegiría? O mejor aún: ¿Qué preguntas tienes que hacerte para saber cuál se adapta a tus propósitos?

  • La columna no tiene nada que ver con la VALIDACIÓN. El tamaño es estándar JPA. La longitud es propiedad. La respuesta debería quedar clara a partir de eso… @Size

    –Neil Stockton

    4 de enero de 2016 a las 14:09

  • ¿La longitud es propietaria? Entonces, ¿no puedo usar esto en general?

    – Chris311

    04/01/2016 a las 14:36

  • Como dice la respuesta, es una extensión de proveedor específica de Hibernate. No tiene sentido usarlo (aparte de las personas que querrían vincularse a una implementación de JPA sin ningún motivo)

    –Neil Stockton

    4 de enero de 2016 a las 14:39

avatar de usuario
Vlad Mihalcea

  1. @Column es una anotación JPA y el length La herramienta de generación de esquemas utiliza el atributo para establecer la longitud de la columna SQL asociada.
  2. @Size es una anotación de Validación de Bean que valida que la Cadena asociada tiene un valor cuya longitud está limitada por los valores mínimo y máximo.
  3. @Length es una anotación específica de Hibernate y tiene el mismo significado que @Size

Por lo tanto 2. y 3. debe validar el String de longitud usando Bean Validation. yo elegiría 2. porque es genérico.

  • No estoy usando archivos de mapeo hbm, por lo que 1 no es adecuado para mí, ¿verdad? ¿Cuándo uso Talla sobre Longitud, o incluso uso ambas?

    – Chris311

    4 de enero de 2016 a las 10:54

  • @Size es universal, siendo definido por JPA. @Length solo está disponible para Hibernate.

    – Vlad Mihalcea

    04/01/2016 a las 10:55

  • @Size es no una anotación JPA en absoluto. ¡Es una anotación API de validación de Bean! también sería mejor decir @Column es una anotación de JPA para que la use el proveedor de JPA en la generación de esquemas (únicamente), ya que todos los proveedores de JPA pueden usarla.

    –Neil Stockton

    8 de octubre de 2016 a las 9:35


¿Ha sido útil esta solución?