it-swarm.com.ru

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

Я не могу заставить Spring Boot автоматически загружать схему базы данных при запуске.

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

Вот мое приложение. 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'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;
    }
}

Есть идеи, что я делаю не так?

34
napentathol

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

  1. Ваши классы сущностей находятся в том же самом или в подпакете относительно того, где у вас есть класс с @EnableAutoConfiguration. Если нет, то ваше весеннее приложение не увидит их и, следовательно, не создаст ничего в db
  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 (см. Вывод консоли) и не может выполнить обновление схема.

43
borys86

Вы пробовали запустить его с:

spring.jpa.generate-ddl=true

а потом 

spring.jpa.hibernate.ddl-auto = create

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

см. функции пружинной загрузки

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

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

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

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

Около:

spring.jpa.hibernate.ddl-auto = create

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

6
erickbhrener

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

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

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

2
user3206144

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

1
Jayant Nayak

Вы должны предоставить конфигурации, учитывающие вашу версию 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: // локальный: 3333/развитие UseSSL = истина spring.datasource.username = админ
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 = верно

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

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

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

У меня была такая же проблема раньше. Моей проблемой были отношения с сущностью, которые я пытался установить с помощью «Списка». Я знал, что это было причиной, потому что программа работала нормально без переменной списка. В вашем случае, я думаю, что проблема заключается в:

private List<Question> _questions;

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

@OneToMany
private Question _questions;

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

public List<Question> findById( Long _id );

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

0
lamarre

Вы просто добавляете 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

0
Abderrahmane

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

0
Ansar Mohamed

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