english - orm para java




Tipo de caja vs primitivo como identificador de entidad (4)

Bueno, usamos no primitivos y tenemos una razón fuerte para ello. Muchos de nuestros campos que son int/Integer por ejemplo, tienen un valor comercial absoluto de zero para ser perfectamente válidos. Piense en un campo de deuda, por ejemplo, está más que bien si el campo es zero , lo que significa que no tiene deuda.

El problema es que con primitivas, cero es un valor predeterminado, por lo que podría olvidarse de establecerlo, por ejemplo, a través de un setDebt , por lo que podría llegar a su base de datos con un valor que nunca tuvo la intención de ir allí. Por esta razón, usamos Integer con algunas validaciones que nunca deben ser nulas, por ejemplo; pero incluso si olvidamos agregar las validaciones adecuadas, ese código se romperá potencialmente con una excepción NullPointerException (preferiblemente en pruebas) y me gusta una excepción más que los valores inconsistentes en la base de datos.

En JPA (implementación de Hibernate) ¿Qué tipo es mejor usar como id de entidad: tipo en caja (por ejemplo, Integer ) o tipo sin caja (por ejemplo, int )?

Un amigo dijo que deberías usar tipos en caja porque cuando creas una nueva entidad en tu programa, Hibernate ve que la identificación es null y entiende que debería crear una nueva fila en la base de datos (en cambio, si id no es null Hibernate puede actualizar una fila existente en la base de datos).

Pero el identificador de mis entidades era int y funcionó bien sin ningún error, y sabemos que el valor predeterminado de las variables de instancia primitivas es 0 . Entonces dijo que tal vez la hibernación trata el 0 como especial y asume que el objeto es nuevo.


Los identificadores únicos de entidades y colecciones pueden ser de cualquier tipo básico excepto binary, blob y clob. (Los identificadores compuestos también están permitidos, ver más abajo).

Los tipos de valores básicos tienen constantes de Tipo correspondientes definidas en org.hibernate.Hibernate. Por ejemplo, Hibernate.STRING representa el tipo de cadena.


Parece que la documentación actual recomienda utilizar el tipo de caja.

Le recomendamos que declare atributos de identificador de nombre consistente en clases persistentes y que use un tipo que pueda ser anulado (es decir, no primitivo).


Podemos pensar de esta manera:

Cuando tenemos un valor x :: Int , entonces 'x' es un cálculo que cuando se evalúa devolverá un Int o estará en la parte inferior (indefinido).

Cuando se ejecuta el programa y se evalúa x , suponga que se evalúa como un Int real (no inferior). Luego, en el futuro, en cualquier momento en que se evalúe x, en lugar de rehacer todo el cálculo, solo queremos obtener el valor que calculamos anteriormente.

Lo que hacemos para lograr esto es reemplazar a thunk (cálculo) que calcula x con un thunk que simplemente devuelve el valor que se calculó anteriormente.

El problema es que cada vez que necesite obtener x en el futuro, deberá seguir este puntero hasta el código (trivial) que devuelve un valor. Esto se vuelve caro si necesita estos valores con frecuencia.

Introduzca valores sin caja. Un valor sin caja es solo ese valor de bajo nivel, no encerrado dentro de un procesador. Esto significa que es estricto en el sentido de que no puede ser indefinido sin que su programa muera necesariamente.





orm