Grails에서 HibernateCriteriaBuilder를 사용할 때 "Null 값이 기본 유형 setter의 속성에 할당되었습니다"라는 오류 메시지가 나타나는 이유는 무엇입니까?


100

내 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)

데이터 입력을 엉망으로 만들지 말고 원시가 아닌 래퍼를 사용할 필요가 없습니다. 몇 가지 값을 입력하지 못했고 데이터베이스에 추가하여이 오류를 수정했습니다.
Goot 2013 년

답변:



46

null 값은 int, long, boolean 등과 같은 기본 유형에 할당 할 수 없습니다. 개체의 필드에 해당하는 데이터베이스 열이 null 일 수있는 경우 필드는 Integer, Long, 같은 래퍼 클래스 여야합니다. 부울 등

위험은 DB에 null이 없으면 코드가 제대로 실행되지만 null이 삽입되면 실패한다는 것입니다.

그리고 항상 getter에서 기본 유형을 반환 할 수 있습니다. 전의:

  private Integer num;

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

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

그러나 대부분의 경우 래퍼 클래스를 반환하고 싶을 것입니다.

따라서 DB 열을 null을 허용하지 않도록 설정하거나 래퍼 클래스를 사용하십시오.


13

기본 유형은 널일 수 없습니다. 따라서 해결책은 tableName.java 파일에서 기본 유형을 기본 래퍼 클래스로 바꾸는 것입니다. 예 :

@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;
}

원시 유형의 래퍼 클래스를 찾으려면 http://en.wikipedia.org/wiki/Primitive_wrapper_class 를 참조 하십시오 .


8

예를 들어 이해하도록 노력하겠습니다. 두 개의 열과 ID (int) 및 NAME (String)이있는 관계형 테이블 (STUDENT)이 있다고 가정하십시오. 이제 ORM으로 다음과 같은 엔티티 클래스를 만들었습니다.

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;
    }

}

테이블에 이미 항목이 있다고 가정합니다. 이제 누군가 "AGE"(int)의 다른 열을 추가하라고 요청하면

ALTER TABLE 학생 추가 연령 int NULL

미리 채워진 테이블에 다른 열을 추가하려면 기본값을 NULL로 설정해야합니다. 이렇게하면 클래스에 다른 필드를 추가 할 수 있습니다. 이제 필드를 선언하기 위해 기본 데이터 유형을 사용할지 또는 기본이 아닌 래퍼 데이터 유형을 사용할 지에 대한 질문이 발생합니다.

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

또는

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

컨테이너가 테이블을 엔터티와 매핑하려고하기 때문에 필드를 기본이 아닌 래퍼 데이터 유형으로 선언해야합니다. 따라서 필드를 래퍼로 선언하지 않고 결국 "기본 유형 setter의 속성에 Null 값이 할당되었습니다"예외를 throw하면 NULL 값 (기본값)을 매핑 할 수 없습니다.


6

Integer를 유형으로 사용하고 그에 따라 setter / getter를 제공하십시오.

private Integer num;

public Integer getNum()...

public void setNum(Integer num)...

4

Entity 클래스 에서 기본 형식을 사용하지 마십시오. 대신 해당 래퍼를 사용하십시오. 그러면이 문제가 해결됩니다.

Entity 클래스에서 나머지 코드 흐름에 대해! = null 유효성 검사를 사용할 수 있습니다.


3

그에 따라 nullDB를 통해 NOT NULL및 Hibernate 엔티티를 통해 완전히 피 @Column(nullable = false)하거나 Long대신 래퍼를 사용 하십시오.long 기본 요소 .

프리미티브는 객체가 아니므로 할당 할 수 없습니다 null.


3

두 가지 방법이 있습니다

  • db 열이 허용되지 않는지 확인하십시오. null
  • 기본 유형 변수에 대한 사용자 래퍼 클래스는 다음과 같이 private int var;초기화 할 수 있습니다.private Integer var;

2

@Dinh Nhat, 기본 유형을 다시 넣었으므로 setter 메서드가 잘못 보입니다.

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

2

매개 변수 유형을 기본에서 Object로 변경하고 setter에 널 (null) 검사를 넣으십시오. 아래 예 참조

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


1

데이터베이스 myAttribute 필드에 0 대신 null이 포함되어 있는지 확인하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.