sql >> Database >  >> RDS >> Mysql

@GeneratedValue polymorfe abstracte superklasse over MySQL

Wat een puinhoop... AUTO_INCREMENT is de verborgen reeks van MySQL. Het radicale probleem is dat MySQL kan de PK niet tegelijkertijd invoegen en retourneren, maar Hibernate heeft dit nodig terwijl INSERT een nieuwe entiteit aan.

De problemen die u tegenkomt:

  1. Als Hibernate een nieuwe Entity opslaat, probeert hij de id automatisch in te stellen op de nieuwe EntityBean. Daarom moet de slaapstand lezen welke ID de database zal gebruiken voordat de slaapstand de nieuwe Tuple opslaat in de tabel.
  2. Als u meerdere servers heeft die toegang hebben tot de database, moet u de sessiefabriek van de hibernate laten beslissen om de ingebouwde volgorde te gebruiken (AUTO-INCREMENT) of de hibernate laten beslissen (GenerationType.AUTO /GenerationType.IDENTITY ) hoe groot het open aanbod van gereserveerde PK's is (Opdracht van een DB-Architect). (We hebben ongeveer 20 servers op één Database, dus op een goed gebruikte tabel gebruiken we een PK-afstand van +100). Als slechts één server toegang heeft tot de database GenerationType.TABLE zal correct zijn.

Hibernate moet de volgende id zelf berekenen met behulp van max(*)+1 maar:

  • Wat als twee verzoeken vragen om max(*)+1 tegelijkertijd/met hetzelfde resultaat? Rechts:de laatste poging om insert zal mislukken.

U moet dus een Tabel LAST_IDS . hebben in de database die de laatste Table-PK's opslaat. Als u er een wilt toevoegen, moet u deze stappen uitvoeren:

  1. Start leesoptimistische transactie.
  2. SELECTEER MAX(address_id) FROM LAST_IDS
  3. het maximum opslaan in een java-variabele, bijv.:$OldID.
  4. $NewID =$OldID + 1. (+100 in pessimistisch slot)
  5. UPDATE LAST_IDS SET address_id=$newID WHERE address_id=$oldID ?
  6. voer de leesoptimistische transactie uit.
  7. als de commit succesvol was, bewaar $newID naar setID() in de HibernateBean die u wilt opslaan.
  8. Laat Hibernate eindelijk de insert aanroepen.

Dit is de enige manier die ik ken.

BTW:Hibernate-Entity's zullen alleen overerving gebruiken als de database overname ondersteunt tussen tabellen zoals PostgreSQL of Oracle .



  1. Een tekenreeks naar hoofdletters converteren in SQL

  2. SolarWinds Serv-U gebruiken op Linux met een SQL Server-verificatiedatabase

  3. Gegevens ophalen uit opgeslagen procedure met meerdere resultaatsets

  4. Hoe een afbeelding in de kamerpersistentiebibliotheek invoegen?