web-dev-qa-db-fra.com

Comment générer un script de création ddl avec une configuration moderne Spring Boot + Data JPA et Hibernate?

Actuellement, j'utilise la valeur par défaut @SpringBootApplication annotation avec les propriétés suivantes dans 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

Depuis JPA 2.1, je devrais pouvoir utiliser le javax.persistence.schema-generation.* propriétés, mais les définir dans mon application.properties semble n'avoir aucun effet.

J'ai vu des exemples comme celui-ci qui connecte toute une série de haricots supplémentaires, mais ils n'utilisent pas Mysql. Et dans tous les cas, le faire comme ça me demande de configurer de nombreuses options dont Spring s'occupe pour moi maintenant.

Mes objectifs sont de:

  • Générer un script SQL de création de schéma dans le dialecte MYSQL
  • sans qu'une connexion à la base de données soit requise
  • Sort le script dans le répertoire de construction
  • Générer des tables d'hibernation envers serait également un avantage considérable.

Je ne veux pas:

  • Créer/supprimer des schémas sur une base de données active

Versions 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

(Utiliser gradle, pas maven)

42
Casey

Ah, juste après avoir posté cette question, une section des documents de données du printemps a attiré mon attention:

73.5 Configuration des propriétés JPA De plus, toutes les propriétés de spring.jpa.properties. * Sont transmises en tant que propriétés JPA normales (avec le préfixe supprimé) lors de la création de l'entité locale EntityManagerFactory.

Donc, pour répondre à ma propre question: préfixez les propriétés javax.persistence avec 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

Après cela, le fichier de schéma a été généré automatiquement à la racine du projet.

86
Casey

Ceci est une configuration spécifique à yml pour que spring boot génère le script de création ddl dans le dossier racine:

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

Mise à jour de votre jpa properties générera les scripts pour vous.

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

Cela générera les scripts à l'emplacement donné. Il existe également d'autres propriétés pouvant être utilisées dans différents cas d'utilisation, veuillez vous reporter à ici

La configuration entière ressemblera à ceci

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