Java >> Java tutorial >  >> Tag >> native

Hibernate Tip:Hvordan fungerer Hibernates native ID-generator

Hibernate Tips er en række indlæg, hvor jeg beskriver en hurtig og nem løsning på almindelige Hibernate-spørgsmål. Hvis du har et spørgsmål til et fremtidigt Hibernate Tip, bedes du skrive en kommentar nedenfor.

Spørgsmål:

En af læserne af min artikel om brug af Hibernate med en MySQL-database stillede følgende spørgsmål:

Hvad er forskellen mellem de følgende to anbefalede tilgange vedrørende de primære nøgler?

@GeneratedValue(strategy = GenerationType.IDENTITY)
@GeneratedValue(generator = "native")
@GenericGenerator(name = "native", strategy = "native")

Løsning:

Som så ofte inden for softwareudvikling er svaret på det spørgsmål:"Det afhænger af ...". I dette tilfælde afhænger det af dialekten som du har konfigureret i din persistence.xml .

Den oprindelige strategi

Når du bruger en @GenericGenerator der refererer til native strategi, bruger Hibernate strategien, der er indbygget understøttet af den konfigurerede dialekt . Du kan finde den tilsvarende kode i dialekten klasse. Her er koden, der bruges i Hibernate 5.4.

public String getNativeIdentifierGeneratorStrategy() {
	if ( getIdentityColumnSupport().supportsIdentityColumns() ) {
		return "identity";
	}
	else {
		return "sequence";
	}
}

For alle almindeligt anvendte databaser, undtagen MySQL, returnerer denne metode strengen "sekvens". Hvis du bruger en MySQL-dialekt, returnerer den "identitet".

Brug af den oprindelige strategi med forskellige dialekter

Lad os bruge følgende enkle enhed med en MySQL- og en PostgreSQL-database.

@Entity
public class Author {

	@Id
	@GeneratedValue(generator = "native")
	@GenericGenerator(name = "native", strategy = "native")
	private Long id;
	
	@Version
	private int version;

	private String firstName;

	private String lastName;
	
	...

}

Når du fortsætter en ny forfatterentitet ved at bruge PostgreSQL-dialekten, kan du se, at Hibernate bruger sekvensen native for at generere den primære nøgleværdi. Og i næste trin indsætter den den nye rekord.

14:03:27,709 DEBUG [org.hibernate.SQL] - 
    select
        nextval ('native')
14:03:27,742 INFO  [org.thoughts.on.java.model.TestIdentityStrategy] - After persist
14:03:27,758 DEBUG [org.hibernate.SQL] - 
    insert 
    into
        Author
        (firstName, lastName, version, id) 
    values
        (?, ?, ?, ?)

Hvis du i stedet bruger en MySQL-database, kan du se, at Hibernate i stedet bruger en automatisk forøget kolonne.

14:05:15,739 DEBUG [org.hibernate.SQL] - 
    insert 
    into
        Author
        (firstName, lastName, version) 
    values
        (?, ?, ?)
14:05:15,760 DEBUG [org.hibernate.id.IdentifierGeneratorHelper] - Natively generated identity: 1

Forskellene mellem native- og identitetsstrategi

Så så længe du bruger begge tilknytninger med en MySQL-database, vil resultatet være det samme. Men der er stadig et par forskelle:

  1. Den indbyggede strategis adfærd ændres, hvis din databasedialekt returnerer en anden strategi end den oprindeligt understøttede. Det kan ske, fordi du nu bruger en anden databasedialekt eller den interne implementering af dialekten er ændret.
  2. @GenericGenerator kortlægning er meget sværere at læse, fordi det afhænger af implementeringen af ​​din databasedialekt.
  3. @GenericGenerator annotation er dvale-specifik. Så du kan ikke bruge denne kortlægning med nogen anden JPA-implementering.

Kortlægningsanbefalinger

Hvis du har læst nogle af mine andre tutorials, kan du sikkert gætte min foretrukne kortlægning. Jeg anbefaler kraftigt at bruge IDENTITY-tilknytningen i stedet for den native en. Det er der flere grunde til. De mest oplagte er den bedre læsbarhed og bedre portabilitet til andre JPA-implementeringer.

Men du skal også huske på, at genereringen af ​​primære nøgler kan have en betydelig indflydelse på din applikations ydeevne. Jeg ønsker derfor at definere strategien eksplicit og stoler ikke på nogen interne implementeringer.

Jeg ser ikke tilpasningsevnen af ​​den native strategi til forskellige databasedialekter som en kæmpe fordel. For næsten alle dialekter bruger Hibernate alligevel SEQUENCE-strategien. Og hvis du har brug for at understøtte MySQL-databaser, kan du nemt tilsidesætte den primære nøglestrategi i din kortlægningsfil.

Få flere oplysninger:

Hvis du er interesseret i primære nøglekortlægninger, bør du også læse følgende artikler:

  • 5 primære nøglekortlægninger til JPA og Hibernate bør enhver udvikler vide
  • Sådan genereres primærnøgler med JPA og Hibernate
  • Sådan genereres UUID'er som primære nøgler med Hibernate

Dvaletipsbog







Få flere opskrifter som denne i min nye bog Hibernate Tips:Mere end 70 løsninger på almindelige dvaleproblemer.

Den giver dig mere end 70 klar-til-brug opskrifter til emner som grundlæggende og avancerede kortlægninger, logning, Java 8-understøttelse, caching og statisk og dynamisk definerede forespørgsler.

Få det nu!



Java tag