web-dev-qa-db-fra.com

Impossible de démarrer le printemps pour créer automatiquement un schéma de base de données

Je ne parviens pas à installer Spring Boot pour charger automatiquement mon schéma de base de données lorsque je le démarre.

Voici mon application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=test
spring.datasource.password=
spring.datasource.driverClassName = com.mysql.jdbc.Driver

spring.jpa.database = MYSQL

spring.jpa.show-sql = true

spring.jpa.hibernate.ddl-auto = create
spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy

Voici mon application.Java:

@EnableAutoConfiguration
@ComponentScan
public class Application {
    public static void main(final String[] args){
        SpringApplication.run(Application.class, args);
    }
}

Voici un exemple d'entité:

@Entity
@Table(name = "survey")
public class Survey implements Serializable {

    private Long _id;

    private String _name;

    private List<Question> _questions;

    /**
     * @return survey's id.
     */
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "survey_id", unique = true, nullable = false)
    public Long getId() {
        return _id;
    }

    /**
     * @return the survey name.
     */
    @Column(name = "name")
    public String getName() {
        return _name;
    }


    /**
     * @return a list of survey questions.
     */
    @OneToMany(mappedBy = "survey")
    @OrderBy("id")
    public List<Question> getQuestions() {
        return _questions;
    }

    /**
     * @param id the id to set to.
     */
    public void setId(Long id) {
        _id = id;
    }

    /**
     * @param name the name for the question.
     */
    public void setName(final String name) {
        _name = name;
    }

    /**
     * @param questions list of questions to set.
     */
    public void setQuestions(List<Question> questions) {
        _questions = questions;
    }
}

Des idées que je fais mal?

34
napentathol

Il y a plusieurs causes possibles:

  1. Vos classes d'entités sont dans le même ou dans un sous-package relatif où vous avez votre classe avec @EnableAutoConfiguration. Sinon, votre application Spring ne les verra pas et ne créera donc rien dans db.
  2. Vérifiez votre configuration, il semble que vous utilisiez des options spécifiques à la veille prolongée, essayez de les remplacer par:

    spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
    spring.jpa.hibernate.ddl-auto=update
    spring.datasource.driverClassName=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/test
    spring.datasource.username=test
    spring.datasource.password=
    
  3. Votre application.properties doit être dans le dossier src/main/resources.

Si vous ne spécifiez pas correctement le dialecte, vous pouvez essayer de le regrouper avec la base de données de démarrage en mémoire et (comme ce fut le cas avec moi), je peux voir qu'il tente de se connecter à l'instance locale HSQL (voir la sortie de la console) et échoue le schéma.

43
borys86

Avez-vous essayé de le lancer avec:

spring.jpa.generate-ddl=true

et alors 

spring.jpa.hibernate.ddl-auto = create

Par défaut, l'exécution (ou la validation) DDL est différée jusqu'au démarrage du ApplicationContext. Il existe également un indicateur spring.jpa.generate-ddl, mais il n'est pas utilisé si Hibernate autoconfig est actif car les paramètres ddl-auto sont plus détaillés.

voir caractéristiques de démarrage de printemps

38
liorsolomon
@SpringBootApplication
@EnableConfigurationProperties
@EntityScan(basePackages = {"com.project.ppaa.model"})  // scan JPA entities
public class Application {

  private static ConfigurableApplicationContext applicationContext;

  public static void main(String[] args) {
    Application.applicationContext = SpringApplication.run(Application.class, args);
  }
}

cela devrait fonctionner automatiquement mais si ce n'est pas le cas, vous pouvez entrer le paquet de base

@EntityScan(basePackages = {"com.project.ppaa.model"})  // scan JPA entities manually
12
Ar maj

Si votre classe d'entité ne se trouve pas dans le même package que votre classe principale, vous pouvez utiliser l'annotation @EntityScan dans la classe principale, en spécifiant l'entité que vous souhaitez enregistrer ou configurer. Comme votre modèle de forfait.

Sur:

spring.jpa.hibernate.ddl-auto = create

Vous pouvez utiliser l'option update. Cela n'effacera aucune donnée et créera des tables de la même manière.

6
erickbhrener

L'utilisation des deux paramètres suivants fonctionne.

spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create
5
Taf

J'ai aussi le même problème. Il m'est avéré que l'annotation @PropertySource est définie sur la classe principale Application pour lire un fichier de propriétés de base différent. Le "application.properties" normal n'est donc plus utilisé. 

2
user3206144

Dans mon cas, les tables n'étaient pas créées automatiquement alors que j'utilisais JPArepository . Après avoir ajouté la propriété ci-dessous dans mon fichier application.properties de l'application springboot, les tables sont maintenant créées automatiquement . spring.jpa. hibernate.ddl-auto = mise à jour

1
Jayant Nayak

Vous devez fournir des configurations tenant compte de votre version de démarrage Spring et de la version des bibliothèques téléchargées sur cette base.

Ma configuration: Spring Boot 1.5.x (1.5.10 dans mon cas) télécharge Hibernate v5.x

Utilisez ci-dessous uniquement si votre configuration Spring Boot a téléchargé Hibernate v4.

spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy

Hibernate 5 ne prend pas en charge ci-dessus.

Si votre configuration de démarrage printanière a téléchargé Hibernate v5.x, préférez la définition ci-dessous:

spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

IMPORTANT: Dans le développement de votre application Spring Boot, vous préférerez utiliser les annotations: @SpringBootApplication qui ont été super-annotées avec: @SpringBootConfiguration and @EnableAutoConfiguration

NOW Si vos classes d'entité sont dans un package différent de celui du package dans lequel réside votre classe principale, Spring Boot n'analysera pas ces packages.

Ainsi, vous devez définir explicitement Annotation: @EntityScan(basePackages = { "com.springboot.entities" })
Cette annotation analyse les classes d'entités annotées basées sur JPA (et d'autres, telles que MongoDB, Cassandra, etc.)

REMARQUE: "Com.springboot.entities" est le nom du package personnalisé.

Voici comment j'ai défini les propriétés basées sur Hibernate et JPA sur application.properties pour créer des tables: -

spring.datasource.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.url = jdbc: mysql: // localhost: 3333/development? useSSL = true spring.datasource.username = admin
spring.datasource.password =

spring.jpa.open-in-view = false
spring.jpa.hibernate.ddl-auto = créer
spring.jpa.generate-ddl = true 
spring.jpa.hibernate.use-new-id-generator-mappings = true
spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.hibernate.naming.strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.show-sql = true
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.format_sql = true

Je suis capable de créer des tables en utilisant ma configuration mentionnée ci-dessus.

Référez-le et changez votre code le cas échéant.

1
Philip Dilip
Use this Sample code

application.properties
# DataSource settings: set here your own configurations for the database 
# connection. In this example we have "dojsb" as database name and 
# "root" as username and password.
spring.datasource.url =jdbc:postgresql://localhost:5432/usman
spring.datasource.username = postgres
spring.datasource.password = 12345

# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

# Show or not log for each sql query
spring.jpa.show-sql = true

# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = create

# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

# Use spring.jpa.properties.* for Hibernate native properties (the prefix is
# stripped before adding them to the entity manager)

# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect

server.port = 8963



Entity Class:



import Java.sql.Timestamp;
import Java.util.UUID;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.Type;


@Entity
@Table(name = "QUEUERECORDS")
public class QueuesRecords {
    @Id
    private UUID id;

    @Column(name="payload", nullable = true)
    @Type(type="text")
    private String payload;


    @Column(name="status", nullable = true)
    @Type(type="text")
    private String status;

    private Timestamp starttime;

    private Timestamp endtime;

    @Column(name="queueid",nullable= true)
    @Type(type="text")
    private String queueid;

    public UUID getId() {
        return id;
    }

    public void setId(UUID id) {
        this.id = id;
    }

    public String getPayload() {
        return payload;
    }

    public void setPayload(String payload) {
        this.payload = payload;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Timestamp getStarttime() {
        return starttime;
    }

    public void setStarttime(Timestamp starttime) {
        this.starttime = starttime;
    }

    public Timestamp getEndtime() {
        return endtime;
    }

    public void setEndtime(Timestamp endtime) {
        this.endtime = endtime;
    }

    public String getQueueid() {
        return queueid;
    }

    public void setQueueid(String queueid) {
        this.queueid = queueid;
    }



}



Main class



import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class Test{

    public static void main(String[] args) {

        SpringApplication.run(Test.class, args);


    }
}
0
Usman Yaqoob

J'ai déjà eu le même poblème. Mon problème était la relation d'entité que j'essayais d'établir en utilisant une "liste". Je savais que c'était la cause parce que le programme fonctionnait bien sans la variable de liste. Dans votre cas, je pense que le problème est:

private List<Question> _questions;

Je suppose que vous avez déjà une classe nommée Question. Alors, essayez d'avoir:

@OneToMany
private Question _questions;

Mais le problème, c’est que, dans votre méthode, vous allez le gérer afin qu’il retourne une liste. J'ai utilisé Spring Data JPA avec CrudRepository. Donc, si vous décidez de l'utiliser, le vôtre peut ressembler à ceci:

public List<Question> findById( Long _id );

Vous devrez faire plus de changements, mais ceux-ci sont assez faciles et simples. Reportez-vous à cette vidéo sur Java Brains pour avoir une meilleure compréhension et voir ce qui doit encore être modifié.

0
lamarre

Vous venez d'ajouter createDatabaseIfNotExist=true comme ceci

spring.datasource.url=jdbc:mysql://localhost:3306/test?createDatabaseIfNotExist=true&amp;amp;useUnicode=true&amp;amp;characterEncoding=utf-8&amp;amp;autoReconnect=true

dans votre fichier application.properties

0
Abderrahmane

Simple, nous ajoutons un point-virgule après 
spring.jpa.hibernate.ddl-auto = create;
ce qui est faux 
spring.jpa.hibernate.ddl-auto = create 
assez

0
Ansar Mohamed

si votre base de données est MySQL:

spring.jpa.hibernate.ddl-auto=update
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=root
spring.datasource.password=root

si votre base de données est PostgreSQL:

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:postgresql://localhost:3306/your_database
spring.datasource.username=root
spring.datasource.password=root
0
Wendell Tufano