Генерирайте схема за база данни с Spring Data JPA

1. Общ преглед

Когато създаваме слой за устойчивост, трябва да съпоставим нашата схема на база данни на SQL с обектния модел, който сме създали в нашия код. Това може да е много работа за ръчно извършване.

В този урок ще видим как да генерираме и експортираме нашата схема на база данни, базирана на моделите на обекти от нашия код .

Първо ще разгледаме свойствата на JPA конфигурацията за генериране на схема. След това ще проучим как да използваме тези свойства в Spring Data JPA.

И накрая, ще проучим алтернатива за генериране на DDL, използвайки родния API на Hibernate.

2. Генериране на JPA схема

JPA 2.1 въведе стандарт за генериране на схема на база данни . Следователно, започвайки с това издание, ние можем да контролираме как да генерираме и експортираме нашата схема на база данни чрез набор от предварително дефинирани свойства на конфигурацията.

2.1. The Script действие

Първо, за да контролира кои DDL команди ще генерираме , JPA въвежда опцията за конфигуриране на скрипт действие :

javax.persistence.schema-generation.scripts.action

Можем да избираме между четири различни опции:

  • none - не генерира никакви DDL команди
  • create - генерира само команди за създаване на база данни
  • drop - генерира само команди за изпускане на база данни
  • drop-and-create - генерира команди за изпускане на база данни, последвани от команди за създаване

2.2. The Script целта

На второ място, за всяко определено действие на скрипта ще трябва да дефинираме съответната целева конфигурация:

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

По същество целта на скрипта определя местоположението на файла, който съдържа командите за създаване или пускане на схема . Така например, ако изберем drop-and-create като действие на скрипт , ще трябва да посочим и двете целеви s.

2.3. Източникът на схемата

И накрая, за да генерираме команди DDL на схемата от нашите модели на обекти, трябва да включим конфигурациите на източника на схемата с избраната опция за метаданни :

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

В следващия раздел ще покажем как можем да използваме Spring Data JPA за автоматично генериране на нашата схема на база данни със стандартните JPA свойства.

3. Генериране на схема с JPA Spring Spring

3.1. Моделите

Нека си представим, че внедряваме система от потребителски акаунти с обект, наречен Account :

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

Всеки акаунт може да има множество настройки на акаунта, така че тук ще имаме картографиране един към много:

@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) private Account account; // getters and setters } 

3.2. Spring Data JPA Configuration

Сега, за да генерираме схемата на базата данни, ще трябва да предадем свойствата за генериране на схемата на използвания доставчик на постоянство. За целта ще зададем собствените JPA свойства в нашия конфигурационен файл под префикса spring.jpa.properties :

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

Следователно Spring Data JPA предава тези свойства на доставчика на постоянство , когато създава бин EntityManagerFactory .

3.3. В create.sql File

В резултат на това при стартиране на приложението горната конфигурация ще генерира команди за създаване на база данни на базата на метаданни за картографиране на обекти. Освен това DDL командите се експортират във файла create.sql , който е създаден в основната ни папка на проекта:

create table account_settings ( id bigint not null, name varchar(255) not null, value varchar(255) not null, account_id bigint not null, primary key (id) ) create table accounts ( id bigint not null, email_address varchar(255), name varchar(100) not null, primary key (id) ) alter table account_settings add constraint FK54uo82jnot7ye32pyc8dcj2eh foreign key (account_id) references accounts (id)

4. Генериране на схеми с API за хибернация

Ако използваме Hibernate, можем да използваме директно неговия собствен API, SchemaExport , за да генерираме нашите командни DDL схеми . По същия начин API за хибернация използва нашите модели на обекти на приложения за генериране и експортиране на схемата на базата данни.

С SchemaExport на Hibernate можем да използваме drop , createOnly и да създаваме методи изрично:

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

Когато стартираме този код, командите ни за създаване на база данни се експортират във файла create.sql в основната ни папка на проекта.

В SchemaExport е част от приложния програмен интерфейс на хибернация Bootstrapping.

5. Опции за генериране на схема

Въпреки че генерирането на схеми може да ни спести време по време на разработката, ние трябва да я използваме само за основни сценарии.

Например, бихме могли да го използваме за бързо завъртане на бази данни за разработка или тестване.

За разлика от тях, за по-сложни сценарии, като миграция на база данни, трябва да използваме по-усъвършенствани инструменти като Liquibase или Flyway .

6. Заключение

В този урок видяхме как да генерираме и експортираме нашата схема на база данни с помощта на свойствата за генериране на JPA схема . Впоследствие видяхме как да постигнем същия резултат, използвайки родния API на Hibernate, SchemaExport .

Както винаги, можем да намерим примерния код на GitHub.