Generer databaseskjema med vårdata JPA

1. Oversikt

Når du lager et utholdenhetslag, må vi matche SQL-databaseskjemaet vårt med objektmodellen som vi har opprettet i koden vår. Dette kan være mye arbeid å gjøre manuelt.

I denne veiledningen, vi skal se hvordan vi kan generere og eksportere databaseskjemaet vårt basert på enhetsmodellene fra koden vår.

Først skal vi dekke JPA-konfigurasjonsegenskapene for generering av skjemaer. Deretter vil vi undersøke hvordan du bruker disse egenskapene i Spring Data JPA.

Til slutt vil vi utforske et alternativ for DDL-generering ved hjelp av Hibernates native API.

2. JPA Schema Generation

JPA 2.1 introduserte en standard for generering av databaseskjemaer. Derfor kan vi starte med denne utgivelsen kontrollere hvordan vi genererer og eksporterer databaseskjemaet vårt gjennom et sett med forhåndsdefinerte konfigurasjonsegenskaper.

2.1. Manuset handling

Først, for å kontrollere hvilke DDL-kommandoer vi skal generere, Introduserer JPA manuset handling konfigurasjonsalternativ:

javax.persistence.schema-generation.scripts.action

Vi kan velge mellom fire forskjellige alternativer:

  • ingen - genererer ingen DDL-kommandoer
  • skape - genererer bare kommandoer for databaselagring
  • miste - genererer bare kommandoer for slipp av databaser
  • slipp og lag - genererer slippkommandoer for databaser fulgt av opprett kommandoer

2.2. Manuset mål

For det andre for hvert spesifiserte skript handling, må vi definere det tilsvarende mål konfigurasjon:

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

I hovedsak skriptet måldefinerer plasseringen til filen som inneholder kommandoer for å opprette eller slippe skjemaet. Så for eksempel hvis vi velger slipp og lag som manus handling vi må spesifisere begge deler måls.

2.3. Skjemaet Kilde

Til slutt, for å generere skjemaet DDL-kommandoer fra enhetsmodellene, bør vi inkludere skjemaet kilde konfigurasjoner med metadata valgt alternativ:

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

I neste avsnitt viser vi hvordan vi kan bruke Spring Data JPA til å automatisk generere databaseskjemaet vårt med standard JPA-egenskaper.

3. Skjema generering med vårdata JPA

3.1. Modellene

La oss forestille oss at vi implementerer et brukerkontosystem med en enhet som heter Regnskap:

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

Hver konto kan ha flere kontoinnstillinger, så her får vi en en-til-mange-kartlegging:

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

3.2. Vårdata JPA-konfigurasjon

Nå for å generere databaseskjemaet må vi sende egenskapene til skjemegenerering til utholdenhetsleverandøren i bruk. For å gjøre dette vil vi sette de innfødte JPA-egenskapene i konfigurasjonsfilen vår under spring.jpa. eiendommer prefiks:

spring.jpa.properties.javax.persistence.schema-generation.scripts.action = create 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 overfører disse egenskapene til utholdenhetsleverandøren, når det skaper EntityManagerFactory bønne.

3.3. De create.sql Fil

Som et resultat, ved oppstart av applikasjonen, vil konfigurasjonen ovenfor generere kommandoer for oppretting av databaser basert på metadata for enhetskartlegging. Videre eksporteres DDL-kommandoene til create.sql fil, som er opprettet i hovedprosjektmappen vår:

opprett tabell konto_innstillinger (id bigint ikke null, navn varchar (255) ikke null, verdi varchar (255) ikke null, konto_id bigint ikke null, primær nøkkel (id)) opprett tabellkontoer (id bigint ikke null, email_adresse varchar (255) , navn varchar (100) ikke null, primærnøkkel (id)) endre tabell konto_innstillinger legge til begrensning FK54uo82jnot7ye32pyc8dcj2eh utenlandsk nøkkel (konto_id) referanser kontoer (id)

4. Skjema generering med dvalemodus API

Hvis vi bruker dvalemodus, vi kan bruke den opprinnelige APIen direkte, SchemaExport, for å generere skjema DDL-kommandoer. På samme måte bruker Hibernate API våre applikasjonsenhetsmodeller for å generere og eksportere databaseskjemaet.

Med dvalemodus SchemaExport vi kan bruke miste, createOnly, og skape metoder eksplisitt:

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

Når vi kjører denne koden, eksporteres kommandoene for databaselagring til create.sql filen i hovedprosjektmappen.

De SchemaExport er en del av Hibernate Bootstrapping API.

5. Alternativer for generering av skjema

Selv om skjemagenerering kan spare oss tid under utvikling, bør vi bare bruke den til grunnleggende scenarier.

For eksempel kan vi bruke den til å raskt øke utviklingen eller teste databaser.

I kontrast, for mer komplekse scenarier, som databasemigrering, vi bør bruke mer raffinert verktøy som Liquibase eller Flyway.

6. Konklusjon

I denne opplæringen så vi hvordan vi genererer og eksporterer databaseskjemaet vårt ved hjelp av JPA skjema-generasjon eiendommer. Deretter så vi hvordan vi kunne oppnå det samme resultatet ved hjelp av Hibernates native API, SchemaExport.

Som alltid kan vi finne eksemplet på GitHub.