내 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)
답변
이 SO 스레드 에 따르면 해결책은 기본이 아닌 래퍼 유형을 사용하는 것입니다. 예 : Integer
대신 int
.
답변
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을 허용하지 않도록 설정하거나 래퍼 클래스를 사용하십시오.
답변
기본 유형은 널일 수 없습니다. 따라서 해결책은 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 를 참조 하십시오 .
답변
예를 들어 이해하도록 노력하겠습니다. 두 개의 열과 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 값 (기본값)을 매핑 할 수 없습니다.
답변
Integer를 유형으로 사용하고 그에 따라 setter / getter를 제공하십시오.
private Integer num;
public Integer getNum()...
public void setNum(Integer num)...
답변
Entity 클래스 에서 기본 형식을 사용하지 마십시오. 대신 해당 래퍼를 사용하십시오. 그러면이 문제가 해결됩니다.
Entity 클래스에서 나머지 코드 흐름에 대해! = null 유효성 검사를 사용할 수 있습니다.
답변
그에 따라 null
DB를 통해 NOT NULL
및 Hibernate 엔티티를 통해 완전히 피 @Column(nullable = false)
하거나 Long
대신 래퍼를 사용 하십시오.long
기본 요소 .
프리미티브는 객체가 아니므로 할당 할 수 없습니다 null
.