1. Обзор
При создании слоя персистентности нам необходимо сопоставить нашу схему базы данных SQL с объектной моделью, созданной в нашем коде. Это может быть много работы, которую нужно выполнить вручную.
В этом уроке мы рассмотрим, как создать и экспортировать схему базы данных на основе моделей сущностей из нашего кода .
Во-первых, мы рассмотрим свойства конфигурации JPA для генерации схемы. Затем мы рассмотрим, как использовать эти свойства в Spring Data JPA.
Наконец, мы рассмотрим альтернативу генерации DDL с использованием собственного API Hibernate.
2. Генерация схемы JPA
JPA 2.1 ввел стандарт для генерации схемы базы данных . Поэтому, начиная с этого выпуска, мы можем управлять созданием и экспортом схемы базы данных с помощью набора предопределенных свойств конфигурации.
2.1. Действие Сценария
Во-первых, чтобы контролировать, какие команды DDL мы будем генерировать , JPA вводит параметр конфигурации script action :
javax.persistence.schema-generation.scripts.action
Мы можем выбрать один из четырех различных вариантов:
- none – не генерирует никаких команд DDL
- create – генерирует только команды создания базы данных
- drop – генерирует только команды удаления базы данных
- drop-and-create – генерирует команды удаления базы данных, за которыми следуют команды создания
2.2. Цель сценария
Во-вторых, для каждого указанного скрипта действия нам нужно будет определить соответствующую конфигурацию target :
javax.persistence.schema-generation.scripts.create-target javax.persistence.schema-generation.scripts.drop-target
По сути, скрипт target определяет местоположение файла, содержащего команды создания или удаления схемы . Так, например, если мы выберем drop-and-create as script action , нам нужно будет указать оба target s.
2.3. Источник Схемы
Наконец, для создания команд DDL схемы из наших моделей сущностей мы должны включить конфигурацию схемы source с выбранным параметром metadata :
javax.persistence.schema-generation.create-source=metadata javax.persistence.schema-generation.drop-source=metadata
В следующем разделе мы покажем, как мы можем использовать Spring Data JPA для автоматического создания схемы базы данных со стандартными свойствами JPA.
3. Генерация схемы с помощью Spring Data JPA
3.1. Модели
Давайте представим, что мы реализуем систему учетных записей пользователей с сущностью под названием Учетная запись :
@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 ListaccountSettings = 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. Конфигурация 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 передает эти свойства поставщику персистентности , когда он создает EntityManagerFactory bean.
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. Генерация схемы с помощью API Hibernate
Если мы используем Hibernate, мы можем напрямую использовать его собственный API, SchemaExport , для генерации наших команд DDL схемы . Аналогичным образом, API Hibernate использует наши модели сущностей приложений для создания и экспорта схемы базы данных.
С помощью Hibernate SchemaExport мы можем использовать методы drop , create Only, и 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 schema-generation . Впоследствии мы увидели, как достичь того же результата с помощью Hibernate native API, SchemaExport .
Как всегда, мы можем найти пример кода на GitHub .