Не удалось получить загрузку 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
Есть несколько возможных причин:
- Ваши классы сущностей находятся в том же самом или в
@EnableAutoConfiguration.
относительно того, где у вас есть класс с @EnableAutoConfiguration.
Если нет, то ваше весеннее приложение их не видит и, следовательно, ничего не создаст в БД -
Проверьте ваш конфиг, кажется, что вы используете некоторые специфичные для спящего режима опции, попробуйте заменить их на:
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=
-
Ваши 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
Это то, что я сделал после прочтения всех ответов выше.
- Добавьте
spring.jpa.hibernate.ddl-auto=update
с другими простыми свойствами в application.properties - бежать
- В консоли вы можете увидеть ошибку. В одном месте ошибки вы можете найти код SQL, сгенерированный этим программным обеспечением для создания вашей таблицы сущностей.
- Скопируйте этот код SQL и вставьте его отдельно в вашу СУБД для создания таблицы.
- После этого снова запустите приложение.
Ответ 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;useUnicode=true&amp;characterEncoding=utf-8&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
в конце. Это решит вашу проблему.
Только это отсутствовало