Langsung ke intinya, masalahnya adalah menyimpan Operator objek ke MySQL DB. Sebelum menyimpan, saya mencoba untuk memilih dari tabel ini dan berhasil, begitu juga koneksi ke db.
Ini adalah objek Operator saya:
@Entity
public class Operator{
@Id
@GeneratedValue
private Long id;
private String username;
private String password;
private Integer active;
//Getters and setters...
}
Untuk menyimpan Saya menggunakan JPA EntityManager
'spersist
metode.
Berikut beberapa log:
Hibernate: insert into Operator (active, password, username, id) values (?, ?, ?, ?)
com.mysql.jdbc.JDBC4PreparedStatement@15724a0: insert into Operator (active,password, username, id) values (0, 'pass', 'user', ** NOT SPECIFIED **)
Menurut saya, masalahnya adalah konfigurasi dengan penambahan otomatis tetapi saya tidak tahu di mana.
Mencoba beberapa trik yang pernah saya lihat di sini: Hibernate tidak menghormati bidang kunci utama auto_increment MySQL Tapi tidak ada yang berhasil
Jika ada file konfigurasi lain yang diperlukan, saya akan menyediakannya.
DDL:
CREATE TABLE `operator` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(40) NOT NULL,
`last_name` VARCHAR(40) NOT NULL,
`username` VARCHAR(50) NOT NULL,
`password` VARCHAR(50) NOT NULL,
`active` INT(1) NOT NULL,
PRIMARY KEY (`id`)
)
Jawaban:
Untuk menggunakan
AUTO_INCREMENT
kolom MySQL , Anda harus menggunakanIDENTITY
strategi:Yang akan Anda dapatkan saat menggunakan
AUTO
MySQL:Yang sebenarnya setara dengan
Dengan kata lain, pemetaan Anda harus berfungsi. Tapi Hibernate harus menghilangkan
id
kolom dalam pernyataan insert SQL, dan sebenarnya tidak. Pasti ada semacam ketidakcocokan di suatu tempat.Apakah Anda menentukan dialek MySQL dalam konfigurasi Hibernate Anda (mungkin
MySQL5InnoDBDialect
atauMySQL5Dialect
tergantung pada mesin yang Anda gunakan)?Juga, siapa yang membuat tabel tersebut? Bisakah Anda menunjukkan DDL yang sesuai?
Tindak lanjut: Saya tidak dapat mereproduksi masalah Anda. Menggunakan kode entitas Anda dan DDL Anda , Hibernate menghasilkan SQL (diharapkan) berikut dengan MySQL:
Perhatikan bahwa file
id
kolom tidak ada dari pernyataan di atas, seperti yang diharapkan.Singkatnya, kode Anda, definisi tabel, dan dialeknya benar dan koheren, seharusnya berfungsi. Jika tidak untuk Anda, mungkin ada sesuatu yang tidak sinkron (lakukan build bersih, periksa ulang direktori build, dll) atau ada hal lain yang salah (periksa log untuk melihat apakah ada yang mencurigakan).
Mengenai dialek, satu - satunya perbedaan antara
MySQL5Dialect
atauMySQL5InnoDBDialect
adalah bahwa nanti menambahkanENGINE=InnoDB
objek tabel saat membuat DDL. Menggunakan satu atau lainnya tidak mengubah SQL yang dihasilkan.sumber
@GeneratedValue(strategy=GenerationType.IDENTITY)
saat Anda menulis@GeneratedValue(strategy=GenerationType.AUTO)
dan@GeneratedValue
. Jadi berhati-hatilah dan cobalah untuk bertele-tele.Menggunakan MySQL, hanya pendekatan ini yang berhasil untuk saya:
2 pendekatan lainnya yang dinyatakan oleh Pascal dalam jawabannya tidak berhasil untuk saya.
sumber
JPA
denganspring-boot
danMySQL
.Bagi siapa pun yang membaca ini yang menggunakan EclipseLink untuk JPA 2.0, berikut adalah dua anotasi yang harus saya gunakan untuk membuat JPA menyimpan data, di mana "MySequenceGenerator" adalah nama apa pun yang ingin Anda berikan pada generator, "myschema" adalah nama dari skema di database Anda yang berisi objek sequence, dan "mysequence" adalah nama objek sequence di database.
Bagi mereka yang menggunakan EclipseLink (dan mungkin penyedia JPA lainnya), PENTING bahwa Anda menyetel atribut alokasiSize agar cocok dengan nilai INCREMENT yang ditentukan untuk urutan Anda dalam database. Jika tidak, Anda akan mengalami kegagalan ketekunan umum, dan membuang banyak waktu untuk mencoba melacaknya, seperti yang saya lakukan. Berikut halaman referensi yang membantu saya mengatasi tantangan ini:
http://wiki.eclipse.org/EclipseLink/Examples/JPA/PrimaryKey#Using_Sequence_Objects
Juga, untuk memberi konteks, inilah yang kami gunakan:
Java 7 Glassfish 3.1 PostgreSQL 9.1 PrimeFaces 3.2 / JSF 2.1
Juga, demi kemalasan, saya membangun ini di Netbeans dengan penyihir untuk menghasilkan Entitas dari DB, Pengendali dari Entitas, dan JSF dari Entitas, dan penyihir (jelas) tidak tahu bagaimana menangani kolom ID berbasis urutan, jadi Anda harus menambahkan anotasi ini secara manual.
sumber
sumber
Jika Anda menggunakan Mysql dengan Hibernate v3 tidak masalah untuk digunakan
GenerationType.AUTO
karena secara internal akan digunakanGenerationType.IDENTITY
, yang paling optimal untuk MySQL.Namun di Hibernate v5, Ini telah berubah.
GenerationType.AUTO
akan menggunakanGenerationType.TABLE
yang menghasilkan banyak kueri untuk penyisipan.Anda dapat menghindarinya dengan menggunakan
GenerationType.IDENTITY
(jika MySQL adalah satu-satunya database yang Anda gunakan) atau dengan notasi berikut (jika Anda memiliki beberapa database):sumber
Saya mencoba segalanya, tetapi tetap tidak dapat melakukan itu, saya menggunakan mysql, jpa dengan hibernate, saya menyelesaikan masalah saya dengan menetapkan nilai id 0 di konstruktor Berikut ini adalah kode deklarasi id saya
sumber
Karena Anda telah menentukan id dalam tipe int pada pembuatan database, Anda juga harus menggunakan tipe data yang sama di kelas model. Dan karena Anda telah mendefinisikan id ke auto increment dalam database, Anda harus menyebutkannya di kelas model dengan meneruskan nilai 'GenerationType.AUTO' ke dalam atribut 'strategy' dalam anotasi @GeneratedValue. Kemudian kodenya menjadi seperti di bawah ini.
sumber
sama dengan jawaban pascal, hanya jika Anda perlu menggunakan .AUTO karena alasan tertentu Anda hanya perlu menambahkan properti aplikasi Anda:
sumber
dapatkah Anda memeriksa apakah Anda terhubung ke database yang benar. karena saya menghadapi masalah yang sama, tetapi akhirnya saya menemukan bahwa saya terhubung ke database yang berbeda.
identitas mendukung kolom identitas di DB2, MySQL, MS SQL Server, Sybase dan HypersonicSQL. Pengenal yang dikembalikan berjenis long, short, atau int.
Info Lebih Lanjut: http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/mapping.html#mapping-declaration-id
sumber
Jika Anda menggunakan MariaDB, ini akan berhasil
Untuk lebih lanjut, Anda dapat memeriksa https://thorben-janssen.com/hibernate-tips-use-auto-incremented-column-primary-key/
sumber