programing

최신 Spring Boot + Data JPA 및 휴지 상태 설정을 사용하여 ddl 작성 스크립트를 생성하는 방법

css3 2023. 3. 21. 22:26

최신 Spring Boot + Data JPA 및 휴지 상태 설정을 사용하여 ddl 작성 스크립트를 생성하는 방법

현재 디폴트를 사용하고 있습니다.@SpringBootApplication에서 다음 속성을 가진 주석application.properties:

spring.datasource.url=jdbc:mysql://localhost/dbname
spring.datasource.username=X
spring.datasource.password=X
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.naming_strategy=my.package.CustomNamingStrategy

JPA 2.1 이후로는 이 기능을 사용할 수 있게 되었습니다.javax.persistence.schema-generation.*properties를 application.properties로 설정해도 효과가 없는 것 같습니다.

이런 예들은 많이 봤지만, 그들은 Mysql을 사용하지 않습니다.어떤 경우든 그렇게 하려면 현재 봄에 대처하고 있는 많은 옵션을 설정해야 합니다.

목표는 다음과 같습니다.

  • MYSQL 방언으로 스키마 생성 SQL 스크립트 생성
  • 데이터베이스 접속이 필요 없음
  • 빌드 디렉토리의 스크립트 출력
  • 휴지 상태의 서버 테이블을 생성하는 것도 큰 이점이 될 것입니다.

하고 싶지 않다:

  • 라이브 데이터베이스에 스키마 작성/삭제

Lib 버전:

   hibernate          : 4.3.11.FINAL
   spring framework   : 4.2.5.RELEASE
   spring-boot        : 1.3.3.RELEASE
   spring-data-jpa    : 1.10.1.RELEASE   // for  querydsl 4 support
   spring-data-commons: 1.12.1.RELEASE   // for  querydsl 4 support

(마븐이 아닌 그래들 사용)

아, 이 질문을 올린 직후에 스프링 데이터 문서 섹션이 눈에 띄었습니다.

73.5 JPA 속성 설정 spring.jpa.properties의 모든 속성 외에*는 로컬 EntityManagerFactory 작성 시 일반 JPA 속성(프리픽스가 제거됨)으로 통과됩니다.

질문에 답하려면 javax.persistence 속성에 spring.jpa.properties를 붙입니다.

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

이렇게 하면 스키마 파일이 프로젝트 루트에 자동으로 생성됩니다.

스프링 부트 루트 폴더에 ddl 작성 스크립트를 생성하기 위한 yml 고유의 설정은 다음과 같습니다.

spring:
  jpa:
    properties:
      javax:
        persistence:
          schema-generation:
            create-source: metadata
            scripts:
              action: create
              create-target: create.sql

다음 코드를 사용하면 검출된 모든 엔티티에 대해 (스프링 부트와는 별도로) 스탠드아론 방식으로 DDL을 생성할 수 있습니다.이를 통해 메인 애플리케이션을 시작하지 않고도 스키마를 생성할 수 있습니다.

다음과 같은 종속성을 사용합니다.

  • org.hibernate:hibernate-core
  • org.reflections:reflections
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.schema.TargetType;
import org.reflections.Reflections;
import org.reflections.util.ConfigurationBuilder;

import javax.persistence.Entity;
import java.util.EnumSet;
import java.util.Set;

public class SchemaGenerator {
    public static void main(String... args) {
        new SchemaGenerator().generateSchema();
    }

    private void generateSchema() {
        var serviceRegistry = new StandardServiceRegistryBuilder()
                .applySetting("hibernate.dialect", "<fully qualifified dialect class name>")
                .build();
        var entities = scanForEntities("<package1>", "<package2>");
        MetadataSources metadataSources = new MetadataSources(serviceRegistry);
        entities.forEach(metadataSources::addAnnotatedClass);
        Metadata metadata = metadataSources.buildMetadata();
        SchemaExport schemaExport = new SchemaExport();
        schemaExport.setFormat(true);
        schemaExport.setOutputFile("<output file name>");
        schemaExport.createOnly(EnumSet.of(TargetType.SCRIPT), metadata);
    }

    private Set<Class<?>> scanForEntities(String... packages) {
        var reflections = new Reflections(
                new ConfigurationBuilder()
                        .forPackages(packages)
        );
       return reflections.getTypesAnnotatedWith(Entity.class);
    }
}

의 갱신jpa properties스크립트가 생성됩니다.

            <prop key="javax.persistence.schema-generation.scripts.action">drop-and-create</prop>
            <prop key="javax.persistence.schema-generation.scripts.create-target">./create_mssql.sql</prop>
            <prop key="javax.persistence.schema-generation.scripts.drop-target">./drop_mssql.sql</prop>

그러면 지정된 위치에 스크립트가 생성됩니다.다양한 사용 사례에 사용할 수 있는 다른 속성도 있습니다. 여기를 참조하십시오.

전체 구성은 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="my-persistence-unit" transaction-type="JTA">
    <description>Forge Persistence Unit</description>
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>

      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
      <property name="javax.persistence.sql-load-script-source" value="META-INF/data.sql"/>
    </properties>
  </persistence-unit>
</persistence>

언급URL : https://stackoverflow.com/questions/36966337/how-to-generate-a-ddl-creation-script-with-a-modern-spring-boot-data-jpa-and-h