Saya mendapatkan kesalahan berikut saat menggunakan atribut primitif di objek domain grails saya:
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)
Jawaban:
Menurut thread SO ini , solusinya adalah dengan menggunakan jenis pembungkus non-primitif; misalnya,
Integer
alih-alihint
.sumber
Nilai null tidak dapat ditetapkan ke tipe primitif, seperti int, long, boolean, dll. Jika kolom database yang sesuai dengan kolom di objek Anda bisa null, maka kolom Anda harus kelas pembungkus, seperti Integer, Long, Boolean, dll.
Bahayanya adalah bahwa kode Anda akan berjalan dengan baik jika tidak ada null di DB, tetapi akan gagal setelah null dimasukkan.
Dan Anda selalu bisa mengembalikan tipe primitif dari getter. Ex:
Tetapi dalam banyak kasus, Anda ingin mengembalikan kelas pembungkus.
Jadi, setel kolom DB Anda agar tidak mengizinkan null, atau gunakan kelas pembungkus.
sumber
Tipe primitif tidak boleh nol. Jadi solusinya adalah mengganti tipe primitif dengan kelas pembungkus primitif di file tableName.java Anda. Seperti:
rujuk http://en.wikipedia.org/wiki/Primitive_wrapper_class untuk menemukan kelas pembungkus dari tipe primivit.
sumber
Saya akan mencoba membuat Anda mengerti dengan bantuan contoh. Misalkan Anda memiliki tabel relasional (STUDENT) dengan dua kolom dan ID (int) dan NAME (String). Sekarang sebagai ORM Anda akan membuat kelas entitas seperti berikut: -
Mari kita asumsikan tabel sudah memiliki entri. Sekarang jika seseorang meminta Anda menambahkan kolom "AGE" (int)
Anda harus menetapkan nilai default sebagai NULL untuk menambahkan kolom lain di tabel yang telah diisi sebelumnya. Ini membuat Anda menambahkan bidang lain di kelas. Sekarang muncul pertanyaan apakah Anda akan menggunakan tipe data primitif atau tipe data pembungkus non primitif untuk mendeklarasikan bidang.
atau
Anda harus mendeklarasikan bidang sebagai tipe data pembungkus non primitif karena penampung akan mencoba memetakan tabel dengan entitas. Oleh karena itu, ia tidak akan dapat memetakan nilai NULL (default) jika Anda tidak mendeklarasikan bidang sebagai pembungkus & pada akhirnya akan menampilkan "Nilai Null ditugaskan ke properti penyetel tipe primitif" Pengecualian.
sumber
gunakan Integer sebagai tipe dan berikan penyetel / pengambil yang sesuai ..
sumber
Jangan gunakan primitif di kelas Entitas Anda , sebagai gantinya gunakan pembungkusnya masing-masing. Itu akan memperbaiki masalah ini.
Di luar kelas Entitas, Anda dapat menggunakan validasi! = Null untuk sisa alur kode Anda.
sumber
Baik sepenuhnya menghindari
null
di DB melaluiNOT NULL
dan di entitas Hibernate melalui@Column(nullable = false)
sesuai atau menggunakanLong
pembungkus sebagai pengganti Andalong
primitif.Primitif bukanlah sebuah Objek, oleh karena itu u tidak dapat menugaskannya
null
.sumber
Ada dua cara
null
private int var;
dapat diinisialisasi sebagaiprivate Integer var;
sumber
@Dinh Nhat, metode penyetel Anda terlihat salah karena Anda meletakkan tipe primitif di sana lagi dan seharusnya:
sumber
Ubah tipe parameter dari primitif ke Object dan beri tanda centang pada penyetel. Lihat contoh di bawah ini
sumber
Mengubah
sumber
Pastikan bidang myAttribute database Anda berisi null, bukan nol.
sumber