Не удалось получить загрузку spring для автоматического создания схемы базы данных

Я не могу получить загрузку spring для автоматической загрузки моей схемы базы данных при запуске.

Вот мои 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

Вот мой Application.java:

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

Вот пример объекта:

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

    private Long _id;

    private String _name;

    private List<Question> _questions;

    /**
     * @return survey 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;
    }
}

Любые идеи, что я делаю неправильно?

Ответы

Ответ 1

Есть несколько возможных причин:

  1. Ваши классы сущностей находятся в том же самом или в @EnableAutoConfiguration. относительно того, где у вас есть класс с @EnableAutoConfiguration. Если нет, то ваше весеннее приложение их не видит и, следовательно, ничего не создаст в БД
  2. Проверьте ваш конфиг, кажется, что вы используете некоторые специфичные для спящего режима опции, попробуйте заменить их на:

    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. Ваши application.properties должны находиться в папке src/main/resources.

Если вы не указали диалект правильно, он может попытаться по умолчанию объединиться с загрузочной базой данных в памяти, и (как это было со мной) я мог видеть, что он пытается подключиться к локальному экземпляру HSQL (см. Вывод на консоль) и не может выполнить обновление схема.

Ответ 2

Вы пытались запустить его с помощью:

spring.jpa.generate-ddl=true

а затем

spring.jpa.hibernate.ddl-auto = create

По умолчанию выполнение DDL (или проверка) отложено до запуска ApplicationContext. Существует также флаг spring.jpa.generate-ddl, но он не используется, если Hibernate autoconfig активен, потому что настройки ddl-auto более мелкие.

см. spring -boot-features

Ответ 3

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

он должен работать автоматически, но если это не так, вы можете ввести базовый пакет

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

Ответ 4

Если ваш класс сущности не находится в том же пакете, что и ваш основной класс, вы можете использовать аннотацию @EntityScan в основном классе, указав объект, который вы хотите сохранить или упаковать. Как и ваш пакет моделей.

О:

spring.jpa.hibernate.ddl-auto = create

Вы можете использовать опцию update. Он не будет удалять данные и будет создавать таблицы таким же образом.

Ответ 5

Использование следующих двух настроек работает.

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

Ответ 6

У меня тоже такая же проблема. Оказалось, что у меня есть аннотация @PropertySource, установленная в основном классе Application, для чтения другого базового файла свойств, поэтому обычные "application.properties" больше не используются.

Ответ 7

В моем случае таблицы не создавались автоматически, даже если я использовал JPArepository. После добавления свойства ниже в файле приложения application.properties приложения springboot таблицы теперь создаются автоматически. spring.jpa.hibernate.ddl-авто = обновление

Ответ 8

Вы должны предоставить конфигурации, учитывающие вашу версию Spring Boot и версию загружаемых библиотек, основанную на ней.

Мои настройки: Spring Boot 1.5.x (в моем случае 1.5.10) загружает Hibernate v5.x

Используйте ниже, только если ваша установка Spring Boot загрузила Hibernate v4.

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

Hibernate 5 не поддерживает выше.

Если ваша установка Spring Boot загрузила Hibernate v5.x, тогда предпочтите следующее определение:

spring.jpa.hibernate.naming.physical-стратегия = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

ВАЖНО: При разработке приложений Spring Boot вы должны использовать аннотацию: @SpringBootApplication которая была аннотирована с помощью: @SpringBootConfiguration and @EnableAutoConfiguration

ТЕПЕРЬ Если ваши классы сущностей находятся в другом пакете, чем пакет, в котором находится ваш основной класс, Spring Boot не будет сканировать эти пакеты.

Таким образом, вам необходимо явно определить Аннотация: @EntityScan(basePackages = { "com.springboot.entities" })
Эта аннотация сканирует аннотированные классы сущностей на основе JPA (и другие, такие как MongoDB, Cassandra и т.д.)

ПРИМЕЧАНИЕ. "Com.springboot.entities" - это имя пользовательского пакета.

Ниже описан способ определения свойств Hibernate и JPA в application.properties для создания таблиц:

spring.datasource.driver класса имя = com.mysql.jdbc.Driver
spring.datasource.url = jdbc: mysql://localhost: 3333/development? useSSL = true spring.datasource.username = admin
spring.datasource.password =

spring.jpa.open-в-зрения = ложь
spring.jpa.hibernate.ddl-авто = создать
spring.jpa.generate-DDL = верно
spring.jpa.hibernate.use-новое-ID-генератор-отображение = верно
spring.jpa.hibernate.naming.physical-стратегия = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.hibernate.naming.strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.show-SQL = верно
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.format_sql = верно

Я могу создавать таблицы, используя мою вышеупомянутую конфигурацию.

Ссылайтесь на него и меняйте свой код, где это применимо.

Ответ 9

Это то, что я сделал после прочтения всех ответов выше.

  1. Добавьте spring.jpa.hibernate.ddl-auto=update с другими простыми свойствами в application.properties
  2. бежать
  3. В консоли вы можете увидеть ошибку. В одном месте ошибки вы можете найти код SQL, сгенерированный этим программным обеспечением для создания вашей таблицы сущностей.
  4. Скопируйте этот код SQL и вставьте его отдельно в вашу СУБД для создания таблицы.
  5. После этого снова запустите приложение.

Ответ 10

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


    }
}

Ответ 11

Раньше у меня была такая же проблема. Моя проблема связана с отношениями Entity, которые я пытался установить, используя "Список". Я знал, что это было причиной, потому что программа прошла отлично без переменной списка. В вашем случае, я думаю, проблема заключается в следующем:
private List<Question> _questions;

Я предполагаю, что у вас уже есть класс с именем Question. Итак, попробуйте:

@OneToMany
private Question _questions;

Но дело в том, что в вашем методе вы будете обрабатывать его, чтобы он возвращал список. Я использовал данные JPA с CrudRepository. Итак, если вы решите использовать его, ваше может выглядеть так:

public List<Question> findById( Long _id );

Есть больше изменений, которые вам нужно будет сделать, но это довольно легко и просто. Обратитесь к этому видео Java Brains, чтобы лучше понять и посмотреть, что еще нужно изменить.

Ответ 12

Просто добавляем точку с запятой после
spring.jpa.hibernate.ddl-auto = create;
что неправильно
spring.jpa.hibernate.ddl-auto = create
довольно

Ответ 13

Вы просто добавляете createDatabaseIfNotExist=true как это

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

в ваш файл application.properties

Ответ 14

если ваша БД 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

если ваша БД - это 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

Ответ 15

Ответ Abderrahmane правильный: добавьте ?createDatabaseIfNotExist=true в свойстве url. Кажется, что ddl-auto ничего не сделает.

Ответ 16

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update

MySQL5Dialect сделал трюк, ранее я использовал 'MySQLDialect'

Ответ 17

Просто добавьте параметр createDatabaseIfNotExist = true в URL источника данных весны

Пример: spring.datasource.url = jdbc: mysql://localhost: 3306/test? CreateDatabaseIfNotExist = true

Ответ 18

У меня была такая же проблема и она была решена только с этим добавлением:

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

Ответ 19

Просто добавьте

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

в конце. Это решит вашу проблему. Только это отсутствовало