최신 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
'programing' 카테고리의 다른 글
Amazon Cloudfront 비용을 절감하는 방법 (0) | 2023.03.21 |
---|---|
고급 사용자 지정 필드를 표시하는 JSON API - WordPress (0) | 2023.03.21 |
리액트에서 쉼표로 숫자를 포맷하려면 어떻게 해야 합니까? (0) | 2023.03.21 |
Twitter 부트스트랩 모달 동적 구축 (0) | 2023.03.21 |
폼 검증을 간소화하는 방법 (0) | 2023.03.21 |