Recibo el siguiente error cuando uso un atributo primitivo en mi objeto de dominio de Grails:
Null value was assigned to a property of primitive type setter of MyDomain.myAttribute
org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of MyDomain.myAttribute
at grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1077)
Respuestas:
Según este hilo SO , la solución es utilizar los tipos de envoltura no primitivos; por ejemplo, en
Integer
lugar deint
.fuente
No se puede asignar un valor nulo a un tipo primitivo, como int, long, boolean, etc. Si la columna de la base de datos que corresponde al campo en su objeto puede ser nula, entonces su campo debe ser una clase contenedora, como Integer, Long, Booleano, etc.
El peligro es que su código funcione bien si no hay nulos en la base de datos, pero fallará una vez que se inserten los nulos.
Y siempre puede devolver el tipo primitivo del getter. Ex:
Pero en la mayoría de los casos querrá devolver la clase contenedora.
Por lo tanto, configure su columna de base de datos para que no permita valores nulos o use una clase contenedora.
fuente
Un tipo primitivo no puede ser nulo. Entonces, la solución es reemplazar el tipo primitivo con la clase contenedora primitiva en su archivo tableName.java. Como:
consulte http://en.wikipedia.org/wiki/Primitive_wrapper_class para encontrar la clase contenedora de un tipo primivito.
fuente
Intentaré hacerte entender con la ayuda de un ejemplo. Suponga que tiene una tabla relacional (ESTUDIANTE) con dos columnas e ID (int) y NAME (String). Ahora, como ORM, habría creado una clase de entidad similar a la siguiente:
Supongamos que la tabla ya tenía entradas. Ahora, si alguien te pregunta, agrega otra columna de "EDAD" (int)
Deberá establecer los valores predeterminados como NULL para agregar otra columna en una tabla precargada. Esto te hace agregar otro campo en la clase. Ahora surge la pregunta de si utilizará un tipo de datos primitivo o un tipo de datos contenedor no primitivo para declarar el campo.
o
tendrá que declarar el campo como un tipo de datos contenedor no primitivo porque el contenedor intentará mapear la tabla con la entidad. Por lo tanto, no podría mapear valores NULL (predeterminado) si no declara el campo como envoltorio y eventualmente arrojaría "Se asignó un valor nulo a una propiedad del establecedor de tipo primitivo" Excepción.
fuente
use Integer como tipo y proporcione setter / getter en consecuencia.
fuente
No use primitivas en sus clases de Entidad , use en su lugar sus respectivos envoltorios. Eso solucionará este problema.
Fuera de sus clases de Entidad, puede usar la validación! = Null para el resto de su flujo de código.
fuente
Evite completamente
null
en DB viaNOT NULL
y en la entidad Hibernate via en@Column(nullable = false)
consecuencia o use elLong
contenedor en lugar de suslong
primitivas.Una primitiva no es un Objeto, por lo tanto, no se puede asignarle
null
.fuente
Hay dos caminos
null
private int var;
se pueden inicializar comoprivate Integer var;
fuente
@Dinh Nhat, su método de establecimiento se ve mal porque puso un tipo primitivo allí nuevamente y debería ser:
fuente
Cambie el tipo de parámetro de primitivo a Object y ponga una marca nula en el setter. Ver ejemplo a continuación
fuente
Cambiar a
fuente
Asegúrese de que el campo myAttribute de su base de datos contenga un valor nulo en lugar de cero.
fuente