无法启动Spring以自动创建数据库架构


76

我无法启动启动时自动启动数据库架构的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

这是我的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 2014年

没有异常,它会启动,然后运行得非常好,直到尝试与数据库进行交互,然后引发有关没有表的异常。日志中也没有相关的警告。
napentathol 2014年

Answers:


91

有几种可能的原因:

  1. 您的实体类位于与之相对的同一个子包中,或者在一个子包中,@EnableAutoConfiguration.如果没有,则您的spring应用不会看到它们,因此不会在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就可以了。谢谢您的帮助!
napentathol

2
1对我有用。如果我不想让我的模型与主班级在同一个项目中,该怎么办。我在模型包中添加了componentscan,但没有帮助我。
emoleumassi

@ O.Badr,有效评论。我很可能从我一次拥有的许多配置文件中粘贴了行。方言和驱动程序应与目标数据库匹配。
borys86 '17

2
@ borys86,因此在您的解决方案中,我们应该org.hibernate.dialect.MySQL5InnoDBDialect改用它,因为问题是关于MySQL的!
O.Badr '17

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 autoconfig处于活动状态,则不会使用它,因为ddl-auto设置更细粒度。

参见spring-boot-features


是的,使用这些属性运行它也不起作用。很奇怪,它甚至没有在jconsole中显示属性值:spring.jpa.CONFIGURATION_PROPERTIES={prefix=spring.jpa, properties={databasePlatform=null, database=MYSQL, generateDdl=false, showSql=false}}
napentathol 2014年

1
可能只是因为运行查询的用户没有创建表的权限?您有任何错误吗?
liorsolomon 2014年

该用户与创建架构:/的用户相同。没有错误,直到我点击了数据库的Rest Controller。
napentathol

这个为我工作<property name =“ hibernate.hbm2ddl.auto”>创建</ property>
abbas

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.RELEASE。但是,我发现根本原因是我应该将ApplicationConfig放在实体包的父包中。因此,它可以自动扫描层次结构中的实体。
MageXellos

这对我有用。非常感谢。花了我几个小时来解决这个问题。问题是,没有错误被抛出,甚至没有任何信息。没什么,我一直在盲目地尝试搜索此问题的每个关键字。但是我仍然不知道为什么它不会自动扫描我的实体。:/
iamjoshua

当我的dao和仓库,实体类位于不同的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

这是我在阅读完以上所有答案后所做的。

  1. spring.jpa.hibernate.ddl-auto=update其他简单属性添加到application.properties
  2. 在控制台中,您可以看到该错误。在错误的某个地方,您可以找到此软件生成的SQL代码以创建您的实体表。
  3. 复制该SQL代码并将其分别粘贴到DBMS中以创建表。
  4. 之后,再次运行该应用程序。

4

你只需要添加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文件


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```。默认接缝为假。
Christoph Raab

4

我用这种解决方案解决了我的问题。只是在application.properties文件的spring.datasource.url属性上插入了一个新参数createDatabaseIfNotExist = true,如下所示:

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

我有带有DDL的src / main / resources / Schema.sql,用于创建数据库架构。我确实使用了flyaway来创建和维护表。

我在这里建立了这个解决方案: 原始答案


3

就我而言,即使我使用的是JPArepository,也不会自动创建表。在springboot应用程序application.properties文件中添加以下属性后,现在会自动创建表。 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 Boot安装程序已经下载了Hibernate v5.x,则首选以下定义:

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

重要说明:在您的Spring Boot应用程序开发中,您应该更喜欢使用注释:@SpringBootApplication它已经超级注释了:@SpringBootConfiguration and @EnableAutoConfiguration

现在,如果您的实体类与主类所在的包位于不同的包中,则Spring Boot不会扫描这些包。

因此,您需要显式定义Annotation:@EntityScan(basePackages = { "com.springboot.entities" })
此注释将扫描基于JPA的注释实体类(以及其他类,例如MongoDB,Cassandra等)

注意: “ com.springboot.entities”是自定义程序包名称。

以下是我在application.properties上定义基于Hibernate和JPA的属性以创建表的方式:-

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 =创建
spring.jpa.generate-ddl = true
spring.jpa.hibernate.use-new-id-generator-mappings = true
弹簧。 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

我可以使用上述配置创建表。

引用它并在适用的地方更改您的代码。


2

我也有同样的问题。原来,我在主Application类上设置了@PropertySource批注,以读取其他基本属性文件,因此不再使用常规的“ application.properties”。


2

对我来说可悲的是,以上给出的答案均无效,因为后来我发现问题出在我的pom文件中。我使用了spring boot starter项目,并添加了另一种不起作用的spring 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;

我假设您已经有一个名为Question的类。因此,尝试具有:

@OneToMany
private Question _questions;

但是问题是,在您的方法中,您将要处理它,以便它返回一个列表。我将Spring Data JPA与CrudRepository一起使用。因此,如果您决定使用它,则您的外观可能如下所示:

public List<Question> findById( Long _id );

您还需要做更多的更改,但是这些更改非常简单明了。请参阅此Java Brains视频,以更好地了解并了解需要修改的内容。


1

只需在spring数据源url中添加createDatabaseIfNotExist = true参数

示例:spring.datasource.url = jdbc:mysql:// localhost:3306 / test?createDatabaseIfNotExist = true


1

我遇到了类似的问题。我使用的是Spring Boot 2.x,却错过了在Spring初始值设定项中添加Postgres依赖项的过程。我手动添加了依赖项

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

这就是我得到的 信息。org.hibernate.dialect.Dialect-HHH000400:使用方言: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

如果您的数据库是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

使用springboot连接到mysql以及自动在数据库中创建表: 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
请更详细地描述为达到此结果您正在做什么以及如何知道它是正确的:)
Lars Nielsen

-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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.