Hoe genereer je een ddl-creatiescript met een moderne Spring Boot + Data JPA en Hibernate setup?

Momenteel gebruik ik de standaard @SpringBootApplication-annotatie met de volgende eigenschappen in 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

Sinds JPA 2.1 zou ik de eigenschappen javax.persistence.schema-generation.*moeten kunnen gebruiken, maar ze in mijn application.properties instellen lijkt geen effect te hebben.

Ik heb voorbeelden gezien zoals dezedie een hele hoop extra bonen opleveren, maar ze gebruiken geen Mysql. En om het zo te doen, moet ik in ieder geval veel opties configureren die de lente nu voor mij regelt.

Mijn doelen zijn:

  • Genereer een SQL-script voor het maken van een schema in het MYSQL-dialect
  • zonder dat een databaseverbinding vereist is
  • Voer het script uit in de bouwmap
  • Ook het genereren van hibernate envers-tabellen zou een enorm pluspunt zijn.

Ik wil niet:

  • Schema’s maken/zetten in een live database

Lib-versies:

  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

(Met gradle, niet maven)


Antwoord 1, autoriteit 100%

Ah, direct nadat ik deze vraag had gepost, viel mijn oog op een gedeelte van de lentegegevensdocumenten:

73.5 JPA-eigenschappen configurerenDaarnaast alle eigenschappen in
spring.jpa.properties.* worden doorgegeven als normale JPA-eigenschappen
(met het voorvoegsel gestript) wanneer de lokale EntityManagerFactory is
gemaakt.

Dus, om mijn eigen vraag te beantwoorden: voeg de eigenschappen javax.persistence toe aan 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

Hierna werd het schemabestand automatisch gegenereerd in de hoofdmap van het project.


Antwoord 2, autoriteit 11%

Dit is een yml-specifieke configuratie om spring boot een ddl-creatiescript in de hoofdmap te laten genereren:

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

Antwoord 3

Als u uw jpa propertiesbijwerkt, worden de scripts voor u gegenereerd.

           <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>

Hiermee worden de scripts op de opgegeven locatie gegenereerd. Er zijn ook andere eigenschappen die voor verschillende use-cases kunnen worden gebruikt, raadpleeg hier

De hele configuratie ziet er zo uit

<?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>

Other episodes