Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

@GeneratedValue superclass abstrak polimorfik melalui MySQL

Sungguh kacau... AUTO_INCREMENT adalah urutan tersembunyi MySQL. Masalah radikalnya adalah MySQL tidak dapat memasukkan dan mengembalikan PK secara bersamaan, tetapi Hibernate membutuhkan ini saat INSERT ing Entitas baru.

Masalah yang Anda hadapi:

  1. Jika Hibernate menyimpan Entitas baru, ia mencoba untuk segera menyetel id ke EntityBean baru. Oleh karena itu hibernasi harus membaca ID apa yang akan digunakan Database sebelum hibernasi menyimpan Tuple baru ke Tabel.
  2. Jika Anda memiliki beberapa Server yang mengakses database, Anda harus membiarkan session-factory hibernate memutuskan untuk menggunakan urutan bawaan (AUTO-INCREMENT) atau membiarkan hibernate memutuskan (GenerationType.AUTO /GenerationType.IDENTITY ) seberapa besar rentang terbuka PK yang dicadangkan (Pekerjaan Arsitek DB). (Kami memiliki sekitar 20 server untuk satu Database, jadi pada tabel yang digunakan dengan baik kami menggunakan jarak PK +100). Jika hanya satu server yang memiliki akses ke database GenerationType.TABLE harus benar.

Hibernate harus menghitung sendiri id berikutnya menggunakan max(*)+1 tapi:

  • Bagaimana jika dua permintaan meminta max(*)+1 pada saat yang sama/dengan hasil yang sama? Kanan:Percobaan terakhir untuk insert akan gagal.

Jadi, Anda perlu memiliki Tabel LAST_IDS dalam database yang menyimpan Tabel-PK terakhir. Jika Anda ingin menambahkannya, Anda harus melakukan langkah-langkah ini:

  1. Mulai transaksi read-optimistic.
  2. PILIH MAX(address_id) DARI LAST_IDS
  3. menyimpan maksimum dalam variabel java yaitu:$OldID.
  4. $NewID =$OldID + 1. (+100 dalam kunci pesimistis)
  5. PERBARUI LAST_IDS SET address_id=$newID WHERE address_id=$oldID ?
  6. melakukan transaksi read-optimistic.
  7. jika komit berhasil, simpan $newID ke setID() di HibernateBean yang ingin Anda simpan.
  8. Akhirnya biarkan Hibernate memanggil sisipan.

Ini satu-satunya cara yang saya tahu.

BTW:Hibernate-Entitys hanya akan menggunakan pewarisan jika Database mendukung pewarisan antar tabel seperti PostgreSQL atau Oracle .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Memeriksa Ukuran Database MySQL di Linux

  2. Cara Menginstal dbWatch untuk Memantau Kinerja MySQL di Linux

  3. MySQL 1062 - Entri duplikat '0' untuk kunci 'PRIMARY'

  4. Cara Mendapatkan Catatan Terakhir Di Setiap Grup Di MySQL

  5. Cara Memeriksa Hak Pengguna di MySQL Workbench menggunakan GUI