Imansible ottenere l’avvio a molla per creare automaticamente lo schema del database

Non riesco a ottenere l’avvio di spring per caricare automaticamente lo schema del database quando lo avvio.

Ecco la mia 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’entity framework di esempio:

 @Entity @Table(name = "survey") public class Survey implements Serializable { private Long _id; private String _name; private List _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 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 questions) { _questions = questions; } } 

Qualche idea su cosa sto facendo male?

Ci sono diverse possibili cause:

  1. Le tue classi di quadro sono nella stessa o in una sottocomponente relativa in cui hai lezione con @EnableAutoConfiguration. Altrimenti la tua app di spring 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.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. La tua application.properties deve essere nella cartella src/main/resources .

Se non hai specificato correttamente il dialetto, potrebbe provare a impostare il bundle insieme al database di avvio in memoria e (come lo sono stato con me) ho potuto vedere che tenta di connettersi HSQL locale (vedi output della console) e fallire nell’aggiornamento lo schema.

Hai provato a eseguirlo con:

 spring.jpa.generate-ddl=true 

e poi

 spring.jpa.hibernate.ddl-auto = create 

Per impostazione predefinita, l’esecuzione (o la convalida) del DDL viene posticipata fino all’avvio di ApplicationContext. 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 le funzioni di avvio a molla

 @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 in caso contrario, è ansible inserire il pacchetto base

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

Se la tua class di quadro non è nello stesso pacchetto della tua class principale, puoi usare @EntityScan annotazione @EntityScan nella class principale, specificando l’Entità che vuoi salvare o anche il pacchetto. Come il tuo pacchetto modello.

Di:

 spring.jpa.hibernate.ddl-auto = create 

È ansible utilizzare l’ update dell’opzione. Non cancellerà alcun dato e creerà le tabelle nello stesso modo.

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

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

Utilizzare le seguenti due impostazioni funziona.

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

È necessario fornire configurazioni considerando la propria versione di avvio a molla e la versione delle librerie scaricate in base allo stesso.

My Setup: Spring Boot 1.5.x (1.5.10 nel mio caso) scarica Hibernate v5.x

Usa di seguito solo se la tua installazione Spring Boot ha scaricato Hibernate v4.

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

Hibernate 5 non supporta sopra.

Se il tuo Spring Boot Setup ha scaricato Hibernate v5.x, allora preferisci sotto la definizione:

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

IMPORTANTE: nello sviluppo dell’applicazione Spring Boot, si consiglia di utilizzare l’annotazione: @SpringBootApplication con super-annotazione con: @SpringBootConfiguration and @EnableAutoConfiguration

ORA Se le tue classi di entity framework sono in un pacchetto diverso rispetto al pacchetto in cui risiede la tua class principale, Spring Boot non eseguirà la scansione di quei pacchetti.

Pertanto è necessario definire in modo esplicativo Annotazione: @EntityScan(basePackages = { "com.springboot.entities" })
Questa annotazione analizza le classi di quadro annotate basate su JPA (e altre come MongoDB, Cassandra ecc.)

NOTA: “com.springboot.entities” è il nome del pacchetto personalizzato.

Di seguito è riportato il modo in cui ho definito le proprietà basate su Hibernate e JPA su application.properties per creare tabelle: –

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 = creare
spring.jpa.generate-ddl = true
nuovi-ID-generatore-mappature spring.jpa.hibernate.use-= 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

Sono in grado di creare tabelle utilizzando la mia configurazione sopra menzionata.

Riferiscilo e cambia il tuo codice laddove applicabile.

Ho avuto lo stesso problema e l’ho risolto solo con questa aggiunta:

 spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect 
 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); } } 

Ho avuto lo stesso problema prima. Il mio problema era la relazione entity framework 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 _questions; 

Suppongo che tu abbia già una class chiamata Question. Quindi, prova ad avere:

 @OneToMany private Question _questions; 

Ma il fatto è che, nel tuo metodo, lo gestirai in modo che restituisca una lista. Ho usato Spring Data JPA con CrudRepository. Quindi, se decidi di usarlo, il tuo può assomigliare a questo:

 public List findById( Long _id ); 

Ci sono più cambiamenti che dovrai fare, ma questi sono abbastanza facili e diretti. Fare riferimento a questo video di Java Brains per avere una migliore comprensione e vedere cos’altro deve essere modificato.

Semplicemente stiamo aggiungendo il punto e virgola dopo
spring.jpa.hibernate.ddl-auto = create;
che è sbagliato
spring.jpa.hibernate.ddl-auto = create
abbastanza

Basta aggiungere

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

alla fine. Questo risolverà il tuo problema. Mancava solo questo