2014-11-12 7 views
16

Non riesco a ottenere l'avvio a molla per caricare automaticamente lo schema del database all'avvio.Impossibile ottenere l'avvio a molla per creare automaticamente lo schema del database

Ecco il mio 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 

Ecco il mio Application.java:

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

Ecco un'entità del campione:

@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; 
    } 
} 

Tutte le idee che ho' sto facendo male?

+1

Cosa eccezione/errore lo fa buttare? – CocoNess

+0

Nessuna eccezione, si avvia e quindi funziona perfettamente fino a quando non tenta di interagire con il db, quindi genera un'eccezione sul fatto che non ci sono tabelle. Neanche gli avvisi rilevanti nel registro. – napentathol

risposta

22

Ci sono diverse possibili cause:

  1. vostre classi di entità sono nella stessa o in un sub-package relativi quella in cui si dispone di classe con @EnableAutoConfiguration. Se poi la vostra l'app di primavera non li vede e quindi non creerà nulla in db
  2. Controlla la tua configurazione, sembra che tu stia utilizzando alcune opzioni specifiche di ibernazione, prova a sostituirle con:

    spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect 
    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. vostri application.properties devono essere nella cartella src/main/resources.

Se non è stato specificato correttamente il dialetto potrebbe cercare di default in bundle insieme di avvio del database in-memory e (come è stato con me) ho potuto vedere che si cerca di connettersi a HSQL locale (vedi console output) e non riescono ad aggiornare lo schema.

+0

Speravo davvero che il # 2 lo risolvesse, ma nessuna modifica – napentathol

+8

cambiando il dialetto in 'org.hibernate.dialect.MySQL5InnoDBDialect' ha funzionato. Grazie per l'aiuto! – napentathol

+2

il numero 1 funziona per me.Cosa posso fare se non voglio avere il mio modello nello stesso progetto con la mia classe principale. Ho aggiunto componenti con il pacchetto del modello, ma non mi è stato d'aiuto. – emoleumassi

25

Hai provato in esecuzione con:

spring.jpa.generate-ddl=true 

e poi

spring.jpa.hibernate.ddl-auto = create 

Per impostazione predefinita l'esecuzione DDL (o convalida) è rimandata alla ApplicationContext è iniziata. Esiste anche un flag spring.jpa.generate-ddl, ma non è usato se Hibernate autoconfig è attivo perché le impostazioni di ddl-auto sono più dettagliate.

vedere spring-boot-features

+0

Sì, l'esecuzione con quelle proprietà non ha funzionato neanche. È strano che non mostri nemmeno il valore delle proprietà nella jconsole: 'spring.jpa.CONFIGURATION_PROPERTIES = {prefix = spring.jpa, properties = {databasePlatform = null, database = MYSQL, generateDdl = false, showSql = false}}' – napentathol

+1

Un colpo lungo potrebbe essere che l'utente che esegue le query non disponga delle autorizzazioni per creare le tabelle? Stai riscontrando errori? – liorsolomon

+0

L'utente è lo stesso utente che ha creato lo schema: /. Nessun errore finché non avrò colpito il Rest Controller che colpisce il database. – napentathol

2

Ho anche lo stesso problema. Ho scoperto che l'annotazione @PropertySource è impostata sulla classe principale dell'applicazione per leggere un file delle proprietà di base diverso, quindi il normale "application.properties" non è più utilizzato.

0

Ho avuto lo stesso problema e risolto solo con questo componente aggiuntivo:

spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect 
+0

Deve essere sbagliato dal momento che l'op usa mysql db. – JanPl

+1

Postgres non aiuterà con il database MySQL. – Gann14

4

Se la classe di entità non è nello stesso pacchetto come la classe principale, è possibile utilizzare @EntityScan annotazione nella classe principale, specificando l'entità che si desidera salvare o pacchettizzare. Come il tuo pacchetto modello.

A proposito di:

spring.jpa.hibernate.ddl-auto = create 

È possibile utilizzare l'opzione update. Non cancellerà alcun dato e creerà le tabelle nello stesso modo.

-1

Basta aggiungere

spring.jpa.databaseplatform=org.hibernate.dialect.PostgreSQLDialect 

alla fine. Questo risolverà il tuo problema. Solo questo mancava

+0

Postgres non aiuta con il database MySQL. – Gann14

5
@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); 
    } 
} 

dovrebbe funzionare automaticamente, ma se così non fosse, è possibile inserire il pacchetto di base

@EntityScan(basePackages = {"com.project.ppaa.model"}) // scan JPA entities manually 
+0

Funziona per me, versione di avvio a molla: 1.5.9.RELEASE. Tuttavia, trovo che la causa principale è mettere ApplicationConfig nel pacchetto padre del mio pacchetto entità. Quindi, potrebbe eseguire automaticamente la scansione delle entità in gerarchia. – MageXellos

0
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

Ho avuto lo stesso problema prima. Il mio problema era la relazione entità che stavo cercando di stabilire usando una "lista". Sapevo che era la causa perché il programma funzionava bene senza la variabile di lista. Nel tuo caso, penso che il problema sia:

private List<Question> _questions; 

Suppongo che tu abbia già una classe chiamata Domanda. Quindi, prova ad avere:

@OneToMany 
private Question _questions; 

Ma il problema è che, nel tuo metodo, lo gestirai in modo che restituisca una lista. Ho usato Spring Data JPA con CrudRepository. Quindi, se si decide di usarlo, il vostro potrebbe assomigliare a questo:

public List<Question> findById(Long _id); 

Non ci sono più cambiamenti si dovrà fare, ma questi sono piuttosto semplice e diretto. Fare riferimento a this Java Brains video per avere una migliore comprensione e vedere cos'altro deve essere modificato.

1

Nel mio caso le tabelle non venivano create automaticamente anche se stavo usando JPArepository. Dopo aver aggiunto la proprietà sottostante nel file application.properties dell'app springboot, le tabelle vengono ora create automaticamente. spring.jpa.hibernate.ddl-auto = aggiornamento

0

semplice stiamo aggiungendo virgola dopo
spring.jpa.hibernate.ddl-auto = create;
che è sbagliato
spring.jpa.hibernate.ddl-auto = create
abbastanza

Problemi correlati