sql >> Database teknologi >  >> RDS >> Mysql

@GeneratedValue polymorf abstrakt superklasse over MySQL

Sikke et rod... AUTO_INCREMENT er MySQL's skjulte sekvens. Det radikale problem er, at MySQL kan ikke indsætte og returnere PK'en på samme tid, men Hibernate har brug for dette, mens INSERT ing af en ny enhed.

De problemer, du støder på:

  1. Hvis Hibernate gemmer en ny Entity, forsøger han at indstille id'et til den nye EntityBean. Derfor skal hibernate læse, hvilket ID vil databasen bruge, før dvaletilstand gemme den nye Tuple til bordet.
  2. Hvis du har flere servere, der tilgår databasen, skal du lade hibernates session-fabrik beslutte at bruge den indbyggede sekvens (AUTO-INCREMENT) eller lade dvaletilstand bestemme (GenerationType.AUTO /GenerationType.IDENTITY ) hvor stort det åbne udvalg af reserverede PK'er er (Job of a DB-Architect). (Vi har omkring 20 servere til en database, så på en godt brugt tabel bruger vi en PK-distance på +100). Hvis kun én server har adgang til databasen GenerationType.TABLE skal være korrekt.

Hibernate skal selv beregne det næste id ved hjælp af max(*)+1 men:

  • Hvad hvis to anmodninger beder om max(*)+1 på samme tid/med samme resultat? Til højre:Det sidste forsøg på at insert vil mislykkes.

Så du skal have en tabel LAST_IDS i databasen, hvem gemmer de sidste tabel-PK'er. Hvis du kan lide at tilføje en, skal du udføre disse trin:

  1. Start læseoptimistisk transaktion.
  2. VÆLG MAX(adresse_id) FRA LAST_IDS
  3. gem maksimum i en java-variabel, dvs.:$OldID.
  4. $NewID =$OldID + 1. (+100 i pessimistisk lås)
  5. OPDATERING LAST_IDS SET address_id=$newID WHERE address_id=$oldID ?
  6. begå den læseoptimistiske transaktion.
  7. hvis commit var vellykket, gem $newID til setID() i HibernateBean, du kan lide at gemme.
  8. Lad endelig Hibernate kalde indsættet.

Dette er den eneste måde, jeg ved det.

BTW:Hibernate-Entitys skal kun bruge nedarvning, hvis databasen understøtter nedarvning mellem tabeller som PostgreSQL eller Oracle .



  1. CAST() Funktion i Oracle

  2. Hvordan finder man lignende resultater og sorterer efter lighed?

  3. LINQ til SQL Take w/o Skip Årsager Flere SQL-sætninger

  4. Sådan opretter du PL/SQL-funktion i Oracle-databasen