Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

javax.persistence.EntityExistsException dengan SequenceGenerator

allocationSize parameter harus cocok dengan INCREMENT BY nilai urutan.

Ia bekerja sedemikian rupa sehingga Hibernate mendapatkan nilai dari urutan (dari database), dan kemudian menyimpan nilai itu dalam memori dan menghasilkan X berikutnya pengidentifikasi berikutnya (di mana X=allocationSize) menambah nilai ini dengan 1 di memori, tanpa menjangkau database.

Setelah Hibernate menghasilkan pengidentifikasi X, ia mendapatkan nilai berikutnya dari urutan, dan menghasilkan pengidentifikasi X baru, menambah nilai itu sebesar 1

Contoh sederhana - katakanlah:

  • @SequenceGenerator( ....allocationSize=5 ...)
  • CREATE SEQUENCE .... INCREMENT BY 1 ...

Dalam kasus di atas Hibernate:

  1. Mengambil angka pertama dari urutan - katakanlah NextVal = 1 dan menyimpannya di memori
  2. Menghasilkan allocationSize=5 berikutnya pengenal menambah nilai di atas dengan 1, yaitu:Id = 1, 2, 3, 4, 5
  3. Mengambil angka berikutnya dari urutan - karena INCREMENT BY 1 , nextVal akan menjadi:2
  4. Menghasilkan allocationSize=5 berikutnya pengenal menambah nilai di atas dengan 1, yaitu:Id = 2, 3, 4, 5, 6

Seperti yang Anda lihat, ini akan menyebabkan kesalahan ganda.

Sekarang tolong pertimbangkan kasus ini:

  • @SequenceGenerator( ....allocationSize=5 ...)
  • CREATE SEQUENCE .... INCREMENT BY 5 ...

Dalam hal ini Hibernasi:

  1. Mengambil angka pertama dari urutan - katakanlah NextVal = 1 dan menyimpannya di memori
  2. Menghasilkan allocationSize=5 berikutnya pengenal menambah nilai di atas dengan 1, yaitu:Id = 1, 2, 3, 4, 5
  3. Mengambil angka berikutnya dari urutan - karena INCREMENT BY 5 , nextVal akan menjadi:6
  4. Menghasilkan allocationSize=5 berikutnya pengenal menambah nilai di atas dengan 1, yaitu:Id = 6, 7, 8, 9, 10

Dalam hal ini tidak ada kesalahan duplikat.

Kasus terakhir memiliki kelemahan yaitu jika sequence tersebut digunakan di luar Hibernate, maka sequence tersebut akan menghasilkan gap.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bisakah Kunci Asing menjadi nol?

  2. SQL Inner bergabung pada pernyataan tertentu

  3. Bergabunglah dengan dua tabel ketika tidak ada nilai dalam satu tabel

  4. PLS-00352 DAN PLS-00201 Melalui Tautan DB

  5. Oracle.DataAccess.dll tidak dapat ditemukan meskipun ada