GrailsでHibernateCriteriaBuilderを使用すると「プリミティブ型セッターのプロパティにnull値が割り当てられました」というエラーメッセージが表示されるのはなぜですか


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

回答:



46

null値をint、long、booleanなどのプリミティブ型に割り当てることはできません。オブジェクトのフィールドに対応するデータベース列がnullになる可能性がある場合、フィールドはInteger、Longなどのラッパークラスである必要があります。ブールなど

危険は、DBにnullがない場合、コードは正常に実行されますが、nullが挿入されると失敗します。

そして、ゲッターからプリミティブ型をいつでも返すことができます。例:

  private Integer num;

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

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

ただし、ほとんどの場合、ラッパークラスを返します。

したがって、DB列をnullを許可しないように設定するか、ラッパークラスを使用します。


13

プリミティブ型を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を参照してください


8

例を参考にして、理解してもらいます。2つの列と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 STUDENT ADD AGE int NULL

事前入力されたテーブルに別の列を追加するには、デフォルト値をNULLに設定する必要があります。これにより、クラスに別のフィールドを追加できます。ここで、フィールドの宣言にプリミティブデータ型を使用するのか、プリミティブ以外のラッパーデータ型を使用するのかという疑問が生じます。

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

または

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

コンテナーはテーブルをエンティティーにマップしようとするため、フィールドをプリミティブ以外のラッパーデータ型として宣言する必要があります。したがって、フィールドをラッパーとして宣言せず、最終的に「Null値がプリミティブ型セッターのプロパティに割り当てられました」例外をスローすると、NULL値をマッピングできません(デフォルト)。


6

タイプとして整数を使用し、それに応じてセッター/ゲッターを提供します。

private Integer num;

public Integer getNum()...

public void setNum(Integer num)...

4

Entityクラスでプリミティブを使用しないでくださいで、代わりにそれぞれのラッパーを使用。これでこの問題は修正されます。

Entityクラスの外では、残りのコードフローに!= null検証を使用できます。


3

nullDB via NOT NULLおよびHibernate entity via を完全に回避するか、プリミティブの代わりにラッパーを@Column(nullable = false)使用してLongくださいlong

プリミティブはオブジェクトではないので、それに割り当てることはできませんnull


3

二つの方法があります

  • db列が許可されていないことを確認してください null
  • のようなプリミティブ型変数のユーザーラッパークラスは、次のようprivate int var;に初期化できます。private Integer var;

2

@Dinh Nhat、プリミティブ型をそこに再度配置したため、セッターメソッドは正しくありません。

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

2

パラメータタイプをプリミティブからオブジェクトに変更し、nullチェックをセッターに入れます。以下の例を参照してください

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


1

データベースのmyAttributeフィールドにゼロではなくnullが含まれていることを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.