2010-07-01 10 views
59

me sale el siguiente error al utilizar un atributo primitiva en mi griales objeto de dominio:¿Por qué obtengo un "valor nulo fue asignado a una propiedad del colocador tipo primitivo de" mensaje de error al utilizar HibernateCriteriaBuilder en 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) 
+0

no ensucie su entrada de datos y no tendrá que usar envoltorios no primitivos. Me perdí para ingresar algunos valores y logré corregir este error al agregarlo a la base de datos. – Goot

Respuesta

97

Según este SO thread, la solución es usar los tipos de envoltura no primitivos; por ejemplo, Integer en lugar de int.

+6

Todos los servicios de Codehaus han finalizado. –

+1

Tuve este error en un proyecto de Spring Boot usando JPA, y esto también lo resolvió ... – Wouter

37

Un valor nulo no se puede asignar 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, su campo debe ser una clase contenedora, como Integer, Long, Boolean, etc.

El peligro es que su código se ejecutará correctamente 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 desde el getter. Ejemplo:

private Integer num; 

    public void setNum(Integer i) { 
    this.num = i; 
    } 

    public int getNum() { 
    return this.num; 
    } 

Pero en la mayoría de los casos, querrá devolver la clase contenedora.

Así que configure su columna DB para no permitir nulos, o use una clase contenedora.

9

Un tipo primitivo no puede ser nulo. Entonces, la solución es reemplazar el tipo primitivo con la clase de envoltura primitiva en su archivo tableName.java. Tales como:

@Column(nullable=true, name="client_os_id") 
private Integer client_os_id; 

public int getClient_os_id() { 
    return client_os_id; 
} 

public void setClient_os_id(int clientOsId) { 
    client_os_id = clientOsId; 
} 

referencia http://en.wikipedia.org/wiki/Primitive_wrapper_class para encontrar clase contenedora de un tipo primivite.

+1

Esto simplemente funciona ... gracias por la respuesta! –

4

uso de enteros como el tipo y proporcionar setter/getter en consecuencia ..

private Integer num; 

public Integer getNum()... 

public void setNum(Integer num)... 
2

@Dinh Nhat, el método de selección se ve mal, ya que poner un tipo primitivo allí de nuevo y que debe ser:

public void setClient_os_id(Integer clientOsId) { 
client_os_id = clientOsId; 
} 
1

Asegúrese de que su base de datos campo myAttribute contiene nulo en lugar de cero.

1

Cualquiera de evitar totalmente null en el PP a través de NOT NULL y en la entidad a través de Hibernate @Column(nullable = false) en consecuencia o utilizar Long envoltorio en lugar de usted long primitivas.

Una primitiva no es un objeto, por lo tanto, no puedes asignarle null a la misma.

2

Trataré de hacerle entender con la ayuda de un ejemplo. Supongamos que tiene una tabla relacional (ESTUDIANTE) con dos columnas e ID (int) y NOMBRE (Cadena). Ahora bien, como ORM le ha hecho una clase de entidad poco como los siguientes: -

package com.kashyap.default; 

import java.io.Serializable; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

/** 
* @author vaibhav.kashyap 
* 
*/ 
@Entity 
@Table(name = "STUDENT") 
public class Student implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -1354919370115428781L; 

    @Id 
    @Column(name = "ID") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    @Column(name = "NAME") 
    private String name; 

    public Student(){ 

    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

Asumamos tabla ya tenía entradas.Ahora bien, si alguien pregunta se agrega otra columna de "edad" (int)

ALTER TABLE ESTUDIANTE añade edad int NULL

Vas a tener que establecer los valores por defecto como NULL para añadir otra columna en una mesa precargada Esto te hace agregar otro campo en la clase. Ahora surge la pregunta de si va a utilizar un tipo de datos primitivo o un tipo de datos de envoltura no primitivo para declarar el campo.

@Column(name = "AGE") 
private int age; 

o

@Column(name = "AGE") 
private INTEGER age; 

que tendrá que declarar el campo como tipo de datos primitivo envoltorio no porque el contenedor va a tratar de un mapa de la mesa con la entidad. Por lo tanto, no podría mapear valores NULL (valor predeterminado) si no declarará el campo como el contenedor & arrojaría eventualmente "Se le asignó un valor nulo a una propiedad del sistema de tipo primitivo" Excepción.

1

Cambie el tipo de parámetro de primitivo a Objeto y ponga una verificación nula en el colocador. Vea el ejemplo a continuación

public void setPhoneNumber(Long phoneNumber) { 
    if (phoneNumber != null) 
     this.phoneNumber = phoneNumber; 
    else 
     this.extension = 0l; 
} 
Cuestiones relacionadas