Перейти к основному содержимому

Создание схемы базы данных с помощью Spring Data JPA

· 5 мин. чтения

1. Обзор

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

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

Сначала мы рассмотрим свойства конфигурации JPA для генерации схемы. Затем мы рассмотрим, как использовать эти свойства в Spring Data JPA.

Наконец, мы рассмотрим альтернативу генерации DDL с использованием собственного API Hibernate.

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

В JPA 2.1 введен стандарт для генерации схемы базы данных . Таким образом, начиная с этого выпуска, мы можем управлять созданием и экспортом нашей схемы базы данных с помощью набора предопределенных свойств конфигурации.

2.1. Действие сценария ``

Во- первых, чтобы контролировать, какие DDL-команды мы будем генерировать , JPA вводит параметр конфигурации действия сценария :

javax.persistence.schema-generation.scripts.action

Мы можем выбрать один из четырех различных вариантов:

  • none — не генерирует никаких DDL-команд
  • create — генерирует только команды создания базы данных
  • drop — генерирует только команды сброса базы данных
  • drop-and-create — генерирует команды удаления базы данных, за которыми следуют команды создания

2.2. Цель скрипта

Во- вторых, для каждого указанного действия скрипта нам нужно определить соответствующую целевую конфигурацию:

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

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

2.3. Источник схемы ``

Наконец, чтобы сгенерировать команды DDL схемы из наших моделей сущностей, мы должны включить конфигурации источника схемы с выбранным параметром метаданных :

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

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

3. Генерация схемы с помощью Spring Data JPA

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> 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 ="account_id", nullable = false)
private Account account;

// getters and setters
}

3.2. Конфигурация Spring Data JPA

Теперь, чтобы сгенерировать схему базы данных, нам нужно передать свойства генерации схемы используемому поставщику постоянства. Для этого мы установим собственные свойства 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 передает эти свойства поставщику постоянства при создании bean- компонента EntityManagerFactory .

3.3. Файл create.sql _

В результате при запуске приложения указанная выше конфигурация будет генерировать команды создания базы данных на основе метаданных сопоставления сущностей. Кроме того, команды 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. Генерация схемы с помощью Hibernate API

Если мы используем Hibernate, мы можем напрямую использовать его собственный API SchemaExport для создания DDL-команд схемы . Точно так же Hibernate API использует модели сущностей нашего приложения для создания и экспорта схемы базы данных.

С SchemaExport Hibernate мы можем явно использовать методы drop , createOnly и create :

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 является частью Hibernate Bootstrapping API .

5. Варианты генерации схемы

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

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

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

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

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

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