Не вдається отримати весняне завантаження для автоматичного створення схеми бази даних


80

Я не можу отримати весняне завантаження для автоматичного завантаження схеми бази даних під час запуску.

Ось мій 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'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;
    }
}

Будь-які ідеї, що я роблю не так?


2
Який виняток / помилку він створює?
CocoNess

Ніяких винятків, він запускається, а потім працює абсолютно нормально, доки не спробує взаємодіяти з db, потім видає виняток про відсутність таблиць. У журналі також немає відповідних попереджень.
напентантал

Відповіді:


97

Є кілька можливих причин:

  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(див. Вивід консолі) екземпляра та не вдається оновити схеми.


19
зміна діалекту на org.hibernate.dialect.MySQL5InnoDBDialectзробила свою справу. Дякую за допомогу!
напентатол

2
номер 1 працює для мене. Що я можу зробити, якщо я не хочу мати свою модель в одному проекті зі своїм основним класом. Я додав компоненти сканування з пакетом моделей, але мені не допоміг.
emoleumassi

@ O..Badr, дійсний коментар. Швидше за все, я вставляв рядки з ряду конфігураційних файлів, які я мав одночасно. діалект та драйвер повинні відповідати цільовій базі даних.
borys86

2
@ borys86, тому у вашому рішенні ми повинні використовувати org.hibernate.dialect.MySQL5InnoDBDialectзамість цього, оскільки питання стосувалось MySQL!
О. Бадр

1
№2 працював у мене, але spring.datasource.driverClassName = com.mysql.jdbc.Driver не потрібен і видає попередження: Завантаження класу com.mysql.jdbc.Driver'. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver '. Драйвер реєструється автоматично за допомогою SPI, і ручне завантаження класу драйвера, як правило, непотрібне.
BaDr Amer

56

Ви намагалися запустити його за допомогою:

spring.jpa.generate-ddl=true

і потім

spring.jpa.hibernate.ddl-auto = create

За замовчуванням виконання DDL (або перевірка) відкладається до запуску ApplicationContext. Існує також прапор spring.jpa.generate-ddl, але він не використовується, якщо активна автоконфігурація Hibernate, оскільки налаштування ddl-auto є більш дрібними.

див. особливості spring-boot


Так, запуск з цими властивостями теж не спрацював. Дивно, що воно навіть не відображає значення властивостей у jconsole:spring.jpa.CONFIGURATION_PROPERTIES={prefix=spring.jpa, properties={databasePlatform=null, database=MYSQL, generateDdl=false, showSql=false}}
napentathol

1
Довгий удар, чи не може бути так, що користувач, який виконує запити, не має дозволів на створення таблиць? Ви отримуєте помилки?
liorsolomon

Користувач - той самий користувач, який створив схему: /. Жодних помилок, поки я не натиснув контролер відпочинку, який потрапляє в базу даних.
напентатол

Це один працював для мене <ім'я властивості = "hibernate.hbm2ddl.auto"> створити </ властивість>
Аббас

18
@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

У мене це працює, весняна завантажувальна версія: 1.5.9.ВИПУСК. Однак я вважаю, що першопричиною є те, що я повинен помістити ApplicationConfig у батьківський пакет мого пакета сутності. Отже, він може автоматично сканувати сутності в ієрархії.
MageXellos

це спрацювало для мене. Дуже дякую. Мені потрібні години, щоб виправити цю справу. Річ у тім, що не було помилки, яка була викинута, або навіть будь-якої іншої інформації. Зовсім нічого, я наосліп намагався здійснити пошук за кожним ключовим словом до цієї проблеми. Однак я все ще не знаю, чому це не буде автоматично сканувати мої сутності. : /
iamjoshua

це допомогло мені, коли мої дао та сховище, сутність класів були в різних модулях maven
anshulkatta

11

Використання наступних двох налаштувань працює.

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

це належить до файлу application.properties?
Олександр Міллс

Так, ви додаєте їх у applications.properties. Крім того, ви можете налаштувати властивості у своєму основному класі SpringBootApplication.
Таф

7

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

Про:

spring.jpa.hibernate.ddl-auto = create

Ви можете скористатися цією опцією update. Це не буде стирати будь-які дані, і створюватиме таблиці таким же чином.


5

Ви просто додаєте 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


5

Це те, що я зробив, прочитавши всі відповіді вище.

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

4

Відповідь Abderrahmane правильна: додайте ?createDatabaseIfNotExist=trueу властивість url. Здається, ddl-autoце нічого не зробить.


1
Питання не в створенні бази даних, а в тому, що Spring JPA не створює таблиці в базі даних. База даних могла бути створена, але не
засівати

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

MySQL5Dialect - це трюк, раніше я використовував "MySQLDialect"


додавши `` spring.jpa.generate-ddl = true '' `` зробив свою справу. Лише за допомогою `` spring.jpa.hibernate.ddl-auto = update ''. Шви за замовчуванням помилкові.
Крістоф Рааб,

4

Я вирішив свою справу за допомогою цього рішення. Щойно вставив новий параметр createDatabaseIfNotExist = true у властивість spring.datasource.url у файл application.properties , наприклад:

spring.datasource.url=jdbc:mysql://localhost:3306/minhasenha?autoReconnect=true&useSSL=false&createDatabaseIfNotExist=true

У мене є сервер / main / resources / Schema.sql з DDL для створення схеми бази даних. І я використовував flyaway для створення та обслуговування таблиць.

Я заснував це рішення тут: оригінальна відповідь


3

У моєму випадку таблиці не створювалися автоматично, навіть якщо я використовував JPArepository. Після додавання властивості, наведеної нижче, до мого файлу app.properties програми springboot, таблиці автоматично створюються. spring.jpa.hibernate.ddl-auto = оновлення


3

Вам потрібно надати конфігурації з урахуванням вашої 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 завантажила Hibernate v5.x, тоді віддайте перевагу визначенню нижче:

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

ВАЖЛИВО: Під час розробки програми Spring Boot вам слід віддати перевагу використанню анотації: @SpringBootApplicationяка була супернотована з:@SpringBootConfiguration and @EnableAutoConfiguration

ЗАРАЗ, якщо ваші сутності класів мають інший пакет, ніж той, в якому знаходиться ваш основний клас, Spring Boot не сканує ці пакети.

Таким чином, вам потрібно чітко визначити Анотація: @EntityScan(basePackages = { "com.springboot.entities" })
Ця анотація сканує засновані на JPA класи анотованих класів (та інші, такі як MongoDB, Кассандра тощо)

ПРИМІТКА: "com.springboot.entities" - це ім'я користувацького пакета.

Нижче наведено спосіб, яким я визначив властивості Hibernate та JPA на application.properties для створення таблиць: -

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 = create
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.jp .properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.format_sql = true

Я можу створювати таблиці, використовуючи мою вищезгадану конфігурацію.

Передайте його та змініть свій код, де це застосовно.


2

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


2

На жаль, жодна з наведених вище відповідей не спрацювала, оскільки згодом я виявив, що проблема виникла з мого pomфайлу. Я використав проект запуску весняного завантаження та додав ще один тип пружинного jpa, який не працював. Спочатку у мене це було,

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
    </dependency> 

Я замінив його таким:

   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
   </dependency> 

Зверніть увагу на spring-boot-starter-data-jpa . Сподіваємось, це може комусь допомогти. Перевірте файл pom і переконайтеся, що ваші залежності збігаються.


1

У мене була та сама проблема раніше. Моєю проблемою були відносини сутності, які я намагався встановити, використовуючи "Список". Я знав, що це причина, тому що програма працювала нормально без змінної list. У вашому випадку, я думаю, проблема полягає в:

private List<Question> _questions;

Я припускаю, що у вас вже є клас під назвою Питання. Отже, спробуйте мати:

@OneToMany
private Question _questions;

Але справа у тому, що у вашому методі ви збираєтеся його обробити, щоб він повернув список. Я використовував Spring Data JPA з CrudRepository. Отже, якщо ви вирішите використовувати його, ваш може виглядати так:

public List<Question> findById( Long _id );

Вам доведеться внести ще кілька змін, але це досить легко і просто. Зверніться до цього відео про мозок Java, щоб краще зрозуміти та побачити, що ще потрібно змінити.


1

Просто додайте параметр createDatabaseIfNotExist = true у URL-адресу джерела даних джерела

Приклад: spring.datasource.url = jdbc: mysql: // localhost: 3306 / test? CreateDatabaseIfNotExist = true


1

Я зіткнувся з подібною проблемою. Я використовую spring boot 2.x, і я пропустив додати залежність Postgres у ініціалізаторі spring. Я додав залежність вручну

<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>

і ось що я отримував - INFO org.hibernate.dialect.Dialect - HHH000400: Використання dialect: org.hibernate.dialect.PostgreSQLDialect замість

**INFO  org.hibernate.dialect.Dialect - HHH000400: Using 
dialect:org.hibernate.dialect.PostgreSQL10Dialect**

Це підключило мене до БД

Це не так дивно, тому що Springboot самостійно робить залежність від версії і зменшує розробку. З іншого боку, якщо Springboot вибирає неправильну залежність, це витрачає багато часу.


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

Ми просто додаємо крапку з комою, після
spring.jpa.hibernate.ddl-auto = create;
чого
spring.jpa.hibernate.ddl-auto = create
досить неправильно


0

якщо ваша БД 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

Мені працювали наведені нижче конфігурації:

spring.jpa.properties.javax.persistence.schema-generation.database.action=create
spring.jpa.properties.javax.persistence.schema-generation.create-database-schemas=true
spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata
spring.jpa.properties.javax.persistence.schema-generation.drop-source=metadata
spring.jpa.properties.javax.persistence.schema-generation.connection=jdbc:mysql://localhost:3306/your_database

0

Якщо у вас виникла ця проблема у Spring Boot, перевірте назви пакетів, які повинні точно відповідати:

com.example.YOURPROJECTNAME - consists main application class
com.example.YOURPROJECTNAME.entity - consists entities

Чи можете ви дати кілька посилань, які говорять, що це є вимогою? Це додасть більшої цінності вашій відповіді.
Ganesh Satpute

0

для підключення до mysql за допомогою springboot, а також автоматичного створення таблиці в базі даних: spring.datasource.url=jdbc:mysql://localhost:3306/solace spring.datasource.username=root spring.datasource.password=root spring.jpa.generate-ddl=true spring.jpa.hibernate.ddl-auto=update


2
Будь ласка, опишіть детальніше, що ви робите для досягнення цього результату, і наскільки ви знаєте, що він правильний :)
Ларс Нільсен,

0

У моєму випадку мені довелося перейменувати таблицю на ім'я user. Я перейменував його, наприклад, usersі це спрацювало.


-2

У мене була та ж проблема, і я вирішив її лише за допомогою цього додавання:

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

2
Postgres не допоможе з базою даних MySQL.
Gann14,

-3

Просто додайте

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

в кінці. Це вирішить вашу проблему. Тільки цього бракувало


1
Postgres не допоможе з базою даних MySQL.
Gann14,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.