tutorial examples example ejemplo java hibernate pojo primitive-types

ejemplo - java hibernate examples



Usar envoltura clase Integer o primitiva int en mapeo de hibernaciĆ³n (3)

La documentación de Hibernate (solo la primera versión que encontré) dice:

La propiedad podría haber sido llamada cualquier cosa, y su tipo podría haber sido cualquier tipo primitivo, cualquier tipo primitivo de "envoltura", java.lang.String o java.util.Date.

...

Recomendamos que declare las propiedades del identificador con nombre consecutivo en las clases persistentes y que use un tipo con nulos (es decir, no primitivo).

Entonces, la "voz del experto" sugiere usar Integer / Long ... pero no se describe por qué este es el caso.

Me pregunto si es para que un objeto que aún no se ha conservado pueda crearse sin un identificador (es decir, con un valor de propiedad de null ), distinguiéndolo de las entidades persistentes.

En la empresa para la que trabajo tenemos esta gran discusión sobre si debería ser mejor usar clases de envoltura para primitivas (java.lang.Integer, java.lang.Long) o si se deben usar los tipos primitivos directamente en los POJOs que se asignan Entidades para tablas en Hibernate.

La idea es que queremos que estos valores no sean nulos en la base de datos.

Los argumentos a favor del uso de primitivas:

  • Manejar estos valores como int significa que nunca pueden ser nulos, lo que hace imposible obtener inadvertidamente una referencia nula en el campo.
  • int = 32/64 bits de memoria. Entero = 16 bytes de memoria y también es más lento

Los argumentos a favor del uso de objetos de contenedor:

  • Podemos agregar una restricción en el nivel de la base de datos para evitar siempre que los valores nulos lleguen allí
  • Podemos terminar con datos engañosos, podemos tener 0 en lugar de valores nulos en la base de datos siempre que el usuario no establezca un valor y los datos erróneos sean difíciles de detectar.
  • Los objetos tienen más poder expresivo que los primitivos. Tenemos valores nulos y también valores enteros, por lo que podemos validarlos más fácilmente usando anotaciones, por ejemplo (javax.validation.constraints.NotNull).

Pensé que debería ser mencionado:

La recomendación de Hibernate (sección 4.1.2) que utiliza propiedades no primitivas en clases persistentes en realidad se refiere, como titulado, a las propiedades del identificador :

4.1.2. Proporcionar una propiedad de identificador

Cat tiene una propiedad llamada id. Esta propiedad se asigna a la (s) columna (s) de clave principal de una tabla de base de datos. La propiedad podría haber sido llamada cualquier cosa, y su tipo podría haber sido cualquier tipo primitivo, cualquier tipo primitivo de "envoltura", java.lang.String o java.util.Date.

...

Recomendamos que declare las propiedades del identificador con nombre consecutivo en las clases persistentes y que use un tipo con nulos (es decir, no primitivo).

No obstante, las ventajas de los primitivos no son fuertes:

  1. Tener un valor incoherente no nulo en una propiedad es peor que NullPointerException, ya que el error al acecho es más difícil de seguir: pasará más tiempo desde que se escribe el código hasta que se detecte un problema y puede aparecer en un contexto de código totalmente diferente su fuente.
  2. En cuanto al rendimiento: antes de probar el código, generalmente es una consideración prematura. La seguridad debe ser lo primero.

Use envolturas, haga su vida simple.

Su modelo de datos debería dictar esto. Debería hacer cumplir la capacidad de anulación en la base de datos de todos modos.

Si son anulables en la base de datos, entonces usa wrappers. Si no aceptan valores y usa wrappers, obtendrá una excepción si intenta insertar un nulo en la base de datos.

Si su modelo de datos no lo dicta, vaya por una convención, use envoltorios todo el tiempo. De esta forma, la gente no tiene que pensar o decidir que un valor de 0 significa nulo.

También consultaría su afirmación de que sería menos eficiente. ¿Has medido esto? Quiero decir realmente lo midió? Cuando habla con una base de datos, hay muchas más consideraciones que la diferencia entre 16 bits y 32 bits.

Solo use la solución simple y consistente. Use envoltorios en todas partes, a menos que alguien le proporcione una buena razón (con estadísticas precisas y medidas) para hacer lo contrario.