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?
Il y a plusieurs causes possibles:
@EnableAutoConfiguration.
Sinon, votre application Spring ne les verra pas et ne créera donc rien dans db.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=
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.
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.
@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
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.
L'utilisation des deux paramètres suivants fonctionne.
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create
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é.
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
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.
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.
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);
}
}
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é.
Vous venez d'ajouter createDatabaseIfNotExist=true
comme ceci
spring.datasource.url=jdbc:mysql://localhost:3306/test?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true
dans votre fichier application.properties
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
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