Generer databaseskema med Spring Data JPA

1. Oversigt

Når vi opretter et persistenslag, skal vi matche vores SQL-databaseskema med den objektmodel, som vi har oprettet i vores kode. Dette kan være meget arbejde at udføre manuelt.

I denne vejledning vi skal se, hvordan vi genererer og eksporterer vores databaseskema baseret på enhedsmodellerne fra vores kode.

Først dækker vi JPA-konfigurationsegenskaberne til skemegenerering. Derefter undersøger vi, hvordan du bruger disse egenskaber i Spring Data JPA.

Endelig vil vi undersøge et alternativ til DDL-generation ved hjælp af Hibernates native API.

2. Generering af JPA-skema

JPA 2.1 introducerede en standard til generering af databaseskemaer. Derfor kan vi starte med denne udgivelse kontrollere, hvordan vi genererer og eksporterer vores databaseskema gennem et sæt foruddefinerede konfigurationsegenskaber.

2.1. Manuskriptet handling

Først, for at kontrollere, hvilke DDL-kommandoer vi genererer, JPA introducerer scriptet handling konfigurationsmulighed:

javax.persistence.schema-generation.scripts.action

Vi kan vælge mellem fire forskellige muligheder:

  • ingen - genererer ikke nogen DDL-kommandoer
  • skab - genererer kun kommandoer til oprettelse af database
  • dråbe - genererer kun database drop-kommandoer
  • drop-and-create - genererer databasefaldkommandoer efterfulgt af opret kommandoer

2.2. Manuskriptet mål

For det andet for hvert specificeret script handling, skal vi definere det tilsvarende mål konfiguration:

javax.persistence.schema-generation.scripts.create-target javax.persistence.schema-generation.scripts.drop-target

I det væsentlige er scriptet måldefinerer placeringen af ​​filen, der indeholder kommandoer til skemaet Opret eller slip. Så hvis vi f.eks. Vælger drop-and-create som script handling vi bliver nødt til at specificere begge dele måls.

2.3. Skemaet Kilde

Endelig skal vi inkludere skemaet for at generere skemaet DDL-kommandoer fra vores enhedsmodeller kilde konfigurationer med metadata valgt valg:

javax.persistence.schema-generation.create-source = metadata javax.persistence.schema-generation.drop-source = metadata

I det næste afsnit viser vi, hvordan vi kan bruge Spring Data JPA til automatisk at generere vores databaseskema med standard JPA-egenskaber.

3. Generering af skema med Spring Data JPA

3.1. Modellerne

Lad os forestille os, at vi implementerer et brugerkontosystem med en enhed, der kaldes Konto:

@Entity @Table (name = "accounts") offentlig klasse konto {@Id @GeneratedValue privat Lang id; @Column (nullable = false, length = 100) private String name; @Column (name = "email_address") privat String emailAddress; @OneToMany (mappedBy = "konto", cascade = CascadeType.ALL) privat Liste accountSettings = ny ArrayList (); // getters og setters}

Hver konto kan have flere kontoindstillinger, så her får vi en en-til-mange kortlægning:

@Entity @Table (name = "account_settings") public class AccountSetting {@Id @GeneratedValue private Lang id; @Column (name = "name", nullable = false) privat strengindstillingsnavn; @Column (name = "value", nullable = false) private String settingValue; @ManyToOne @JoinColumn (navn, nullable = false) privat konto konto; // getters og setters} 

3.2. Spring Data JPA-konfiguration

Nu for at generere databaseskemaet bliver vi nødt til at videregive skemadannelsesegenskaberne til den persistensudbyder, der er i brug. For at gøre dette indstiller vi de oprindelige JPA-egenskaber i vores konfigurationsfil under spring.jpa. ejendomme præfiks:

spring.jpa.properties.javax.persistence.schema-generation.scripts.action = opret spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target = create.sql spring.jpa.properties.javax. persistence.schema-generation.scripts.create-source = metadata

Følgelig, Spring Data JPA videregiver disse egenskaber til persistensudbyderen, når det skaber EntityManagerFactory bønne.

3.3. Det create.sql Fil

Som et resultat genererer ovenstående konfiguration kommandoer til oprettelse af database ved opstart af applikationen baseret på enhedsmappningsmetadataene. Desuden eksporteres DDL-kommandoerne til create.sql fil, der oprettes i vores hovedprojektmappe:

Opret tabel konto_indstillinger (id bigint ikke nul, navn varchar (255) ikke nul, værdi varchar (255) ikke nul, konto_id bigint ikke nul, primær nøgle (id)) Opret tabel konti (id bigint ikke nul, email_adresse varchar (255) , navn varchar (100) ikke null, primær nøgle (id)) ændre tabel konto_indstillinger tilføje begrænsning FK54uo82jnot7ye32pyc8dcj2eh fremmed nøgle (konto_id) referencekonti (id)

4. Generering af skema med dvale-API

Hvis vi bruger dvale, vi kan bruge dets oprindelige API direkte, Skemaeksport, for at generere vores skema-DDL-kommandoer. Ligeledes bruger Hibernate API vores applikationsenhedsmodeller til at generere og eksportere databaseskemaet.

Med dvale Skemaeksport vi kan bruge dråbe, createOnly, og skab metoder eksplicit:

MetadataSources metadataSources = nye MetadataSources (serviceRegistry); metadataSources.addAnnotatedClass (Account.class); metadataSources.addAnnotatedClass (AccountSettings.class); Metadata metadata = metadataSources.buildMetadata (); SchemaExport schemaExport = ny SchemaExport (); schemaExport.setFormat (sand); schemaExport.setOutputFile ("create.sql"); schemaExport.createOnly (EnumSet.of (TargetType.SCRIPT), metadata);

Når vi kører denne kode, eksporteres vores kommandoer til oprettelse af database til create.sql fil i vores hovedprojektmappe.

Det Skemaeksport er en del af Hibernate Bootstrapping API.

5. Indstillinger for generering af skema

Selvom skemaoprindelse kan spare os tid under udviklingen, skal vi kun bruge det til grundlæggende scenarier.

For eksempel kunne vi bruge det til hurtigt at forbedre udviklings- eller testdatabaser.

I modsætning hertil for mere komplekse scenarier, som databasemigrering, vi skal bruge mere raffineret værktøj som Liquibase eller Flyway.

6. Konklusion

I denne vejledning så vi, hvordan vi genererer og eksporterer vores databaseskema ved hjælp af JPA skema-generation ejendomme. Derefter så vi, hvordan man opnår det samme resultat ved hjælp af Hibernates native API, Skemaeksport.

Som altid kan vi finde eksempelkoden over på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found