无法在Spring Boot Startup上执行data.sql和schema.sql

问题描述 投票:1回答:3

我正在尝试针对在容器中运行的MySQL数据库为Spring Boot应用程序执行一些数据库初始化。在身份验证过程中,我收到错误“找不到表”。我检查了数据库,确实没有创建表。 DB属性中是否缺少某些内容?

spring.datasource.url = jdbc:mysql://172.17.0.2:3306/schema
spring.datasource.username = user
spring.datasource.password = password
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = create-drop
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.data.rest.basePath=/
spring.datasource.data = classpath:/data.sql
spring.datasource.schema = classpath:/schema.sql

总而言之,只要我从mysql命令行创建DDL,JDBC设置就可以正常工作。所以它只是在启动时不执行data.sql和schema.sql。我需要一些额外的mysql属性吗?

spring spring-boot
3个回答
0
投票

就像你一样

spring.jpa.hibernate.ddl-auto = create-drop

Spring不运行schema.sql和data.sql。

尝试一下

spring.jpa.hibernate.ddl-auto = none

检查文档:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html

在基于JPA的应用程序中,您可以选择让Hibernate创建模式或使用schema.sql,但您不能同时执行这两个操作。如果使用schema.sql,请确保禁用spring.jpa.hibernate.ddl-auto。


0
投票

要从您的实体类创建架构和表,请使用以下设置:

application.properties:

# Mysql
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/myschema?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&createDatabaseIfNotExist=true
spring.datasource.username=user
spring.datasource.password=pass

# Hibernate
spring.datasource.platform=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=update
spring.data.jpa.repositories.enabled=true

这里重要的设置是spring.datasource.urlcreateDatabaseIfNotExist=true参数和spring.jpa.hibernate.ddl-auto=update

您的实体类应如下所示:

@Entity
public class MyEntity implements Serializable {

    @Id
    @Column(name = "id", columnDefinition = "BIGINT(20)")
    private Long id;
    @Column(name = "int_column", columnDefinition = "INT(4)")
    private Integer intColumn;
    @Column(name = "string_column", columnDefinition = "VARCHAR(15)")
    private String stringColumn;
    // more fields here with getters, setters, etc...
}
  • 您可以使用columnDefinition注释的@Column设置定义表列。在这里你也可以使用unique=true设置。
  • 您的表格将以您的课程命名,但您也可以使用@Table("my_custom_name")进行更改。您还可以在此处设置唯一约束。
  • 对于自动递增ID,请在id字段上使用@GeneratedValue(strategy = GenerationType.IDENTITY)注释。

希望这可以帮助


0
投票

您可以使用以下属性更新application.properties。

application.properties:

spring.jpa.hibernate.ddl-auto=none
spring.jpa.generate-ddl=false
spring.datasource.initialization-mode=always

默认情况下,spring.jpa.generate-ddl的值为false。如果将spring.jpa.generate-ddl = true或spring.jpa.hibernate.ddl-auto设置为任何值validate,update,create,create-drop。 Spring启动会生成模式脚本,并根据应用程序中可用的实体创建表。

现在,您应该在resources文件夹下创建schema.sql和data.sql文件,并在application.properties中设置属性spring.datasource.initialization-mode = always。

您还可以基于该平台运行脚本。假设您要运行hsqldb数据库的脚本,然后在application.properties文件中设置spring.datasource.platform = hsqldb,并在resources文件夹下创建脚本文件schema-hsqldb.sql和data-hsqldb.sql。你可以找到更多关于how to load schema.sql and data.sql on startup with spring boot的信息。

© www.soinside.com 2019 - 2024. All rights reserved.