Saya menghadapi apa yang saya pikir merupakan masalah sederhana dengan Hibernate, tetapi tidak dapat menyelesaikannya (forum Hibernate yang tidak terjangkau tentu tidak membantu).
Saya memiliki kelas sederhana yang ingin saya pertahankan, tetapi terus dapatkan:
SEVERE: Field 'id' doesn't have a default value
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not insert: [hibtest.model.Mensagem]
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
[ a bunch more ]
Caused by: java.sql.SQLException: Field 'id' doesn't have a default value
[ a bunch more ]
Kode yang relevan untuk kelas yang bertahan adalah:
package hibtest.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Mensagem {
protected Long id;
protected Mensagem() { }
@Id
@GeneratedValue
public Long getId() {
return id;
}
public Mensagem setId(Long id) {
this.id = id;
return this;
}
}
Dan kode yang berjalan sebenarnya hanya:
SessionFactory factory = new AnnotationConfiguration()
.configure()
.buildSessionFactory();
{
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
Mensagem msg = new Mensagem("YARR!");
session.save(msg);
tx.commit();
session.close();
}
Saya mencoba beberapa "strategi" dalam GeneratedValue
anotasi tetapi sepertinya tidak berhasil. Inisialisasi id
juga tidak membantu! (misalnya Long id = 20L
).
Adakah yang bisa menjelaskan?
EDIT 2: dikonfirmasi: mengacaukan @GeneratedValue(strategy = GenerationType.XXX)
tidak menyelesaikannya
ASK: menciptakan kembali database memecahkan masalah
java
hibernate
jpa
persistence
André Chalella
sumber
sumber
GenerationType
dalam@GeneratedValue
dariIDENTITY
keAUTO
dan itu bekerja untuk saya. Selain itu, Anda dapat mengatur properti kenaikan otomatis di MySQL.Jawaban:
Terkadang perubahan yang dilakukan pada model atau ORM mungkin tidak mencerminkan akurat pada database bahkan setelah eksekusi
SchemaUpdate
.Jika kesalahan tersebut tampaknya tidak memiliki penjelasan yang masuk akal, coba buat ulang basis data (atau setidaknya buat yang baru) dan perancahlah dengan
SchemaExport
.sumber
SET foreign_key_checks = 0;
adalah teman Anda. PastikanSET foreign_key_checks = 1;
saat Anda selesai.Jika Anda ingin MySQL secara otomatis menghasilkan kunci utama maka Anda harus mengatakannya saat membuat tabel. Anda tidak harus melakukan ini di Oracle.
Pada Kunci Utama Anda harus memasukkan
AUTO_INCREMENT
. Lihat contoh di bawah ini.Inilah Entitasnya
sumber
Anda harus menggunakan pembaruan di properti hbm2ddl Anda. buat perubahan dan perbarui untuk Membuat sehingga bisa membuat tabel.
Ini berhasil untuk saya.
sumber
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id;
Dan dengan nilaicreate
dihbm2ddl.auto
properti perubahan diterapkan dalam Skema Database saya. Terima kasih banyak ....Lihatlah
GeneratedValue
strategi. Biasanya terlihat seperti:sumber
Menjatuhkan tabel dari database secara manual dan kemudian menjalankan kembali aplikasi bekerja untuk saya. Dalam tabel kasus saya tidak dibuat dengan benar (dengan kendala) saya kira.
sumber
Saya punya masalah ini. Kesalahan saya adalah saya telah mengatur file yang dapat dimasukkan dan dapat diupdate sebagai salah dan mencoba untuk mengatur bidang dalam permintaan. Bidang ini diatur sebagai NON NULL dalam DB.
Kemudian saya mengubahnya menjadi - insertable = true, updatable = true
Itu bekerja dengan baik nanti.
sumber
Saya datang ke sini karena pesan kesalahan, ternyata saya punya dua tabel dengan nama yang sama.
sumber
Saran lain adalah untuk memeriksa bahwa Anda menggunakan tipe yang valid untuk bidang yang dibuat secara otomatis. Ingat bahwa itu tidak bekerja dengan String, tetapi bekerja dengan Long:
Sintaks di atas bekerja untuk menghasilkan tabel di MySQL menggunakan Hibernate sebagai penyedia JPA 2.0.
sumber
Saya memiliki masalah yang sama. Saya menemukan contoh tutorial Hibernate One-To-One Mapping menggunakan Foreign key Annotation dan mengikutinya langkah demi langkah seperti di bawah ini:
Buat tabel database dengan skrip ini:
Berikut adalah entitas dengan tabel di atas
Masalahnya telah diatasi.
Pemberitahuan: Kunci utama harus disetel ke AUTO_INCREMENT
sumber
Cukup tambahkan kendala bukan-nol
Saya memiliki masalah yang sama. Saya baru saja menambahkan kendala bukan-nol dalam pemetaan xml. Itu berhasil
sumber
Mungkin itulah masalah dengan skema tabel. jatuhkan meja dan jalankan kembali aplikasi.
sumber
Selain apa yang disebutkan di atas, jangan lupa saat membuat tabel sql untuk membuat AUTO INCREMENT seperti dalam contoh ini
sumber
Silakan periksa apakah nilai Default untuk id kolom di tabel tertentu. Jika tidak menjadikannya sebagai default
sumber
Saya memiliki masalah yang sama. Saya menggunakan tabel bergabung dan semua yang saya miliki dengan bidang id baris dan dua kunci asing. Saya tidak tahu persis penyebabnya tetapi saya melakukan yang berikut
Pastikan saya memiliki kode hash dan sama dengan metode
sumber
Pengecualian yang sama dilemparkan jika tabel DB memiliki kolom lama yang tidak dihapus.
Misalnya:
attribute_id NOT NULL BIGINT(20),
danattributeId NOT NULL BIGINT(20),
Setelah menghapus atribut yang tidak digunakan, dalam kasus saya contractId , masalahnya teratasi.
sumber
Ini terjadi pada saya dengan suatu
@ManyToMany
hubungan. Saya telah mencatat salah satu bidang dalam hubungan dengan@JoinTable
, saya menghapusnya dan menggunakanmappedBy
atribut di @ManyToMany sebagai gantinya.sumber
Saya mencoba kode dan dalam kasus saya kode di bawah ini menyelesaikan masalah. Saya belum menyelesaikan skema dengan benar
Silakan coba tambahkan
,catalog="databasename"
sama seperti yang saya lakukan.sumber
Dalam kasus saya, saya mengubah tabel yang menyinggung dan bidang "id" dalam pertanyaan saya membuatnya AUTO_INCREMENT, saya masih perlu mencari tahu mengapa pada waktu penempatan itu tidak menjadikannya "AUTO_INCREMENT" sehingga saya harus melakukannya sendiri!
sumber
Bagaimana dengan ini:
Saya harap ini membantu Anda.
sumber
Cobalah untuk mengubah
Long
jenis objek ke tipelong
primitif (jika menggunakan primitif ok untuk Anda).Saya memiliki masalah yang sama dan mengubah tipe membantu saya.
sumber
Saya memiliki masalah ini, karena keliru saya telah menempatkan
@Transient
anotasi di atas atribut khusus itu. Dalam kasus saya kesalahan ini masuk akal.sumber
"Field 'id' tidak memiliki nilai default" karena Anda tidak mendeklarasikan
GenerationType.IDENTITY
dalamGeneratedValue
Anotasi.sumber
Masalah ini karena kadang-kadang Anda perlu memperbarui / membuat database lagi atau kadang-kadang jika Anda telah menambahkan bidang dalam tabel db tetapi tidak bukan kelas entitas maka tidak dapat memasukkan nilai nol atau nol sehingga kesalahan ini datang. Jadi periksa kedua sisi side.db dan kelas Entity.
sumber
Ketika bidang Anda tidak dapat dibatalkan, diperlukan nilai default untuk ditentukan pada pembuatan tabel. Buat ulang tabel dengan AUTO_INCREMENT diinisialisasi dengan benar sehingga DB tidak akan memerlukan nilai default karena ia akan menghasilkannya sendiri dan tidak pernah menempatkan NULL di sana.
);
https://www.w3schools.com/sql/sql_autoincrement.asp
sumber
saya mendapatkan kesalahan seperti itu dalam GCP cloud sql ketika bidang model tidak cocok dengan bidang tabel yang benar di db. Contoh: ketika di bidang model adalah
fieldName
tabel di db harus ada bidang
field_name
Memperbaiki nama bidang tabel membantu saya.sumber
Tambahkan metode
hashCode()
ke Kelas Entity Bean Anda dan coba lagisumber