Generirajte shemu baze podataka pomoću Spring Data JPA

1. Pregled

Kada stvaramo sloj postojanosti, moramo uskladiti našu shemu SQL baze podataka s objektnim modelom koji smo kreirali u našem kodu. Ovo može puno raditi ručno.

U ovom vodiču, vidjet ćemo kako generirati i izvesti shemu baze podataka na temelju entitetskih modela iz našeg koda.

Prvo ćemo pokriti svojstva JPA konfiguracije za generiranje sheme. Zatim ćemo istražiti kako koristiti ta svojstva u Spring Data JPA.

Napokon, istražit ćemo alternativu za generiranje DDL-a pomoću Hibernateovog izvornog API-ja.

2. Izrada JPA sheme

JPA 2.1 uveo je standard za generiranje sheme baze podataka. Stoga, počevši od ovog izdanja, možemo kontrolirati kako generirati i izvesti našu shemu baze podataka putem skupa unaprijed definiranih svojstava konfiguracije.

2.1. Skripta akcijski

Prvi, za kontrolu DDL naredbi koje ćemo generirati, JPA predstavlja skriptu akcijski opcija konfiguracije:

javax.persistence.schema-generation.scripts.action

Možemo birati između četiri različite opcije:

  • nijedna - ne generira DDL naredbe
  • stvoriti - generira samo naredbe za stvaranje baze podataka
  • pad - generira samo naredbe za ispuštanje baze podataka
  • ispuštaj i stvori - generira naredbe za ispuštanje baze podataka nakon kojih slijede naredbe za stvaranje

2.2. Skripta cilj

Drugo, za svaku navedenu skriptu akcijski, trebat ćemo definirati odgovarajuće cilj konfiguracija:

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

U biti, scenarij ciljdefinira mjesto datoteke koja sadrži naredbe za stvaranje ili ispuštanje sheme. Tako, na primjer, ako odaberemo ispuštaj i stvori kao skripta akcijski morat ćemo navesti oboje ciljs.

2.3. Shema Izvor

Konačno, da bismo generirali DDL naredbe sheme iz naših entitetskih modela, trebali bismo uključiti shemu izvor konfiguracije s metapodaci odabrana opcija:

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

U sljedećem odjeljku pokazat ćemo kako možemo koristiti Spring Data JPA za automatsko generiranje sheme baze podataka sa standardnim svojstvima JPA.

3. Generiranje sheme s proljetnim podacima JPA

3.1. Modeli

Zamislimo da implementiramo sustav korisničkih računa s entitetom tzv Račun:

@Entity @Table (name = "accounts") Račun javne klase {@Id @GeneratedValue private Long id; @Kolona (nullable = false, length = 100) ime privatnog niza; @Column (name = "email_address") privatni niz emailAddress; @OneToMany (mappedBy = "account", cascade = CascadeType.ALL) private List accountSettings = new ArrayList (); // geteri i postavljači}

Svaki račun može imati više postavki računa, pa ćemo ovdje imati mapiranje jedan prema više:

@Entity @Table (name = "account_settings") javna klasa AccountSetting {@Id @GeneratedValue private Long id; @Column (name = "name", nullable = false) private String settingName; @Column (name = "value", nullable = false) private String settingValue; @ManyToOne @JoinColumn (ime, nullable = false) račun privatnog računa; // geteri i postavljači} 

3.2. Proljetna JPA konfiguracija podataka

Sada da bismo generirali shemu baze podataka trebat ćemo proslijediti svojstva generiranja sheme pružatelju trajnosti koji se koristi. Da bismo to učinili, postavićemo izvorna JPA svojstva u našoj konfiguracijskoj datoteci pod proljeće.jpa.svojstva prefiks:

spring.jpa.properties.javax.persistence.schema-generation.scripts.action = stvori spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target = create.sql spring.jpa.properties.javax. postojanost.schema-generation.scripts.create-source = metapodaci

Slijedom toga, Spring Data JPA prosljeđuje ova svojstva pružatelju trajnosti, kada stvara EntityManagerFactory grah.

3.3. The stvoriti.sql Datoteka

Kao rezultat toga, pri pokretanju aplikacije, gornja konfiguracija generirat će naredbe za stvaranje baze podataka na temelju metapodataka mapiranja entiteta. Nadalje, DDL naredbe se izvoze u stvoriti.sql datoteka koja se kreira u našoj glavnoj mapi projekta:

izraditi postavke računa_tabele (id bigint nije null, ime varchar (255) nije null, vrijednost varchar (255) nije null, account_id bigint nije null, primarni ključ (id)) stvoriti račune tablice (id bigint nije null, email_address varchar (255) , ime varchar (100) nije null, primarni ključ (id)) promijeni tablicu account_settings dodaj ograničenje FK54uo82jnot7ye32pyc8dcj2eh inozemni ključ (account_id) reference računi (id)

4. Generiranje sheme s Hibernate API-jem

Ako koristimo Hibernate, možemo izravno koristiti svoj izvorni API, SchemaExport, za generiranje naše DDL naredbe sheme. Isto tako, Hibernate API koristi naše modele entiteta aplikacije za generiranje i izvoz sheme baze podataka.

Uz Hibernate SchemaExport možemo koristiti pad, createOnly, i stvoriti metode eksplicitno:

MetadataSources metadataSources = novi MetadataSources (serviceRegistry); metadataSources.addAnnotatedClass (Account.class); metadataSources.addAnnotatedClass (AccountSettings.class); Metapodaci metapodaci = metadataSources.buildMetadata (); SchemaExport schemaExport = novi SchemaExport (); schemaExport.setFormat (true); schemaExport.setOutputFile ("create.sql"); schemaExport.createOnly (EnumSet.of (TargetType.SCRIPT), metapodaci);

Kada pokrenemo ovaj kod, naše se naredbe za stvaranje baze podataka izvoze u stvoriti.sql datoteku u našoj glavnoj mapi projekta.

The SchemaExport dio je Hibernate Bootstrapping API-ja.

5. Opcije generiranja sheme

Iako nam generiranje sheme može uštedjeti vrijeme tijekom razvoja, trebali bismo je koristiti samo za osnovne scenarije.

Na primjer, mogli bismo ga koristiti za brzo pokretanje razvojnih ili testiranja baza podataka.

Suprotno tome, za složenije scenarije, poput migracije baze podataka, trebali bismo koristiti profinjeniji alat poput Liquibase ili Flyway.

6. Zaključak

U ovom uputstvu vidjeli smo kako generirati i izvesti shemu baze podataka uz pomoć JPA generiranje sheme Svojstva. Poslije smo vidjeli kako postići isti rezultat koristeći Hibernateov izvorni API, SchemaExport.

Kao i uvijek, primjer koda možemo pronaći na GitHubu.