Grails'te HibernateCriteriaBuilder'ı kullanırken neden "İlkel tür ayarlayıcı özelliğine atanmış" hata iletisi alıyorum


100

Grails etki alanı nesnemde ilkel bir öznitelik kullanırken şu hatayı alıyorum:

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)

veri girişinizi bozmayın ve ilkel olmayan sarmalayıcılar kullanmak zorunda kalmazsınız. Bazı değerleri girmeyi özledim ve bu hatayı veritabanına ekleyerek düzeltmeyi başardım.
Goot

Yanıtlar:



46

İnt, long, boolean vb. Gibi ilkel bir türe boş değer atanamaz. Nesnenizdeki alana karşılık gelen veritabanı sütunu boş olabilirse, alanınız Tamsayı, Uzun gibi bir sarmalayıcı sınıf olmalıdır. Boole vb.

Tehlike, veritabanında boş değerler yoksa kodunuzun düzgün çalışması, ancak boş değerler eklendiğinde başarısız olmasıdır.

Ve alıcıdan her zaman ilkel türü iade edebilirsiniz. Ör:

  private Integer num;

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

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

Ancak çoğu durumda sarmalayıcı sınıfını döndürmek isteyeceksiniz.

Dolayısıyla, DB sütununuzu boş değerlere izin vermeyecek şekilde ayarlayın veya bir sarmalayıcı sınıfı kullanın.


13

İlkel bir tür boş olamaz. Dolayısıyla çözüm, tableName.java dosyanızdaki ilkel türü ilkel sarmalayıcı sınıfıyla değiştirmektir. Gibi:

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

referans http://en.wikipedia.org/wiki/Primitive_wrapper_class bir primivite tip sınıfı sarıcı bulmak.


8

Bir örnek yardımıyla anlamanızı sağlamaya çalışacağım. İki sütun ve ID (int) ve NAME (String) içeren bir ilişkisel tablonuz (ÖĞRENCİ) olduğunu varsayalım. Şimdi ORM olarak, aşağıdaki gibi bir varlık sınıfı yapardınız: -

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

}

Tabloda zaten girişler olduğunu varsayalım. Şimdi biri sizden başka bir "AGE" (int) sütunu eklemenizi isterse

DEĞİŞİKLİK TABLOSU ÖĞRENCİ YAŞ EKLE int NULL

Önceden doldurulmuş bir tabloya başka bir sütun eklemek için varsayılan değerleri NULL olarak ayarlamanız gerekir. Bu, sınıfa başka bir alan eklemenizi sağlar. Şimdi, alanı bildirmek için ilkel veri türü mü yoksa ilkel olmayan sarmalayıcı veri türü mü kullanacağınız sorusu ortaya çıkıyor.

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

veya

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

alanı ilkel olmayan sarmalayıcı veri türü olarak bildirmeniz gerekir, çünkü kap tabloyu varlıkla eşlemeye çalışacaktır. Dolayısıyla, alanı sarmalayıcı olarak bildirmezseniz ve sonunda "İlkel tür ayarlayıcı özelliğine boş değer atandı" İstisnası atarsanız, NULL değerleri (varsayılan) eşleyemez.


6

tür olarak Tamsayı kullanın ve buna göre ayarlayıcı / alıcı sağlayın.

private Integer num;

public Integer getNum()...

public void setNum(Integer num)...

4

Varlık sınıflarınızda ilkelleri kullanmayın, bunun yerine kendi sarmalayıcılarını kullanın. Bu, bu sorunu çözecektir.

Varlık sınıflarınız dışında, kod akışınızın geri kalanı için! = Null doğrulamasını kullanabilirsiniz.


3

Ya tam kaçınmak nullyoluyla DB NOT NULLaracılığıyla ve Hazırda varlıktaki @Column(nullable = false)buna göre veya kullanım Longsarıcı yerine ait longprimitives.

İlkel bir Nesne değildir, bu nedenle nullona atayamazsınız .


3

İki yol var

  • Db sütununa izin verilmediğinden emin olun null
  • Gibi ilkel tür değişken için Kullanıcı Sarıcı sınıfları private int var;şu şekilde başlatılabilir:private Integer var;

2

@Dinh Nhat, ayarlayıcı yönteminiz yanlış görünüyor çünkü oraya tekrar ilkel bir tür koydunuz ve şöyle olmalı:

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

2

Parametre türünü ilkelden Nesne'ye değiştirin ve ayarlayıcıya boş bir denetim koyun. Aşağıdaki örneğe bakın

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

2
@Column(name ="LEAD_ID")
private int leadId; 

Değişmek

@Column(name ="LEAD_ID")
private Integer leadId; 

1

Veritabanınızın myAttribute alanınızın sıfır yerine null içerdiğinden emin olun .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.