Mysql
 sql >> Baza danych >  >> RDS >> Mysql

@GeneratedValue polimorficzna abstrakcyjna nadklasa nad MySQL

Co za bałagan... AUTO_INCREMENT to ukryta sekwencja MySQL. Radykalny problem polega na tym, że MySQL nie można wstawić i zwrócić PK w tym samym czasie, ale Hibernate potrzebuje tego podczas INSERT nowego podmiotu.

Problemy, które napotykasz:

  1. Jeśli Hibernate zapisze nowy Entity, spróbuje immerdentellly ustawić id na nowy EntityBean. Dlatego hibernacja musi przeczytać, jakiego identyfikatora użyje baza danych, zanim hibernacja zapisze nową krotkę w tabeli.
  2. Jeśli masz wiele serwerów, które mają dostęp do bazy danych, powinieneś pozwolić fabryce sesji hibernacji zdecydować się na użycie wbudowanej sekwencji (AUTO-INCREMENT) lub pozwolić hibernacji zdecydować (GenerationType.AUTO /GenerationType.IDENTITY ) jak duży jest otwarty zakres zarezerwowanych PK (praca architekta DB). (Mamy około 20 serwerów do jednej bazy danych, więc na dobrze używanym stole używamy odległości PK równej +100). Jeśli tylko jeden serwer ma dostęp do bazy danych GenerationType.TABLE będzie poprawne.

Hibernate musi samodzielnie obliczyć następny identyfikator za pomocą max(*)+1 ale:

  • Co, jeśli dwa żądania poproszą o max(*)+1 w tym samym czasie/z takim samym skutkiem? Po prawej:ostatnia próba insert zawiedzie.

Musisz więc mieć tabelę LAST_IDS w bazie danych, która przechowuje ostatnie Table-PK. Jeśli chcesz go dodać, musisz wykonać następujące czynności:

  1. Rozpocznij transakcję optymistyczną do odczytu.
  2. SELECT MAX(address_id) FROM LAST_IDS
  3. przechowuj maksimum w zmiennej java, np.:$OldID.
  4. $NowyID =$StaryID + 1. (+100 w pesymistycznej blokadzie)
  5. AKTUALIZUJ LAST_IDS USTAW adres_id=$newID GDZIE adres_id=$oldID ?
  6. zatwierdź transakcję optymistyczną do odczytu.
  7. jeśli zatwierdzenie się powiodło, przechowaj $newID do setID() w HibernateBean, który chcesz zapisać.
  8. Na koniec pozwól Hibernate wywołać wstawkę.

To jedyny sposób, jaki znam.

BTW:Hibernate-Entitys powinny używać dziedziczenia tylko wtedy, gdy baza danych obsługuje dziedziczenie między tabelami, takie jak PostgreSQL lub 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. Jak dodać niestandardowe ograniczenie CHECK w tabeli MySQL?

  2. Android JDBC nie działa:ClassNotFoundException na sterowniku

  3. Jak zarządzać MySQL — dla administratorów baz danych Oracle

  4. MySQL - Jak wyszukać dokładne dopasowanie słów za pomocą LIKE?

  5. Jak włączyć automatyczne ponowne łączenie klienta MySQL z MySQLdb?