我正在尝试针对容器中运行的MySQL数据库对Spring Boot应用程序执行一些数据库初始化。
在身份验证过程中,我收到错误消息“找不到表”。我已经检查了数据库,并且确实没有创建任何表。
数据库属性中缺少什么吗?
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的一些额外属性吗?
答案 0 :(得分: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。
答案 1 :(得分: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.url
参数和createDatabaseIfNotExist=true
的{{1}}
您的实体类应如下所示:
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
进行更改。您还可以在此处设置唯一约束。
对于自动递增的ID,请在您的id字段上使用@Table("my_custom_name")
注释。
希望这会有所帮助
答案 2 :(得分: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 ,< strong>更新,创建,创建拖放。 Spring boot会生成模式脚本,并根据应用程序中可用的实体创建表。
现在,您应该在资源文件夹下创建 schema.sql 和 data.sql 文件,并设置属性 spring.datasource.initialization-mode = always < / strong>在application.properties中。
您还可以基于平台运行脚本。假设您要运行 hsqldb 数据库的脚本,然后在application.properties文件中设置 spring.datasource.platform = hsqldb ,并创建脚本文件 schema-hsqldb .sql 和 data-hsqldb.sql 。 您可以找到有关how to load schema.sql and data.sql on startup with spring boot的更多详细信息。
答案 3 :(得分:0)
一切正常,直到弹簧启动从中更新pom文件
<version>1.5.8.RELEASE</version>
到
<version>2.3.3.RELEASE</version>
切换通过并更新所有测试均无任何异常。在2.3.3版中,由于数据库中数据丢失而导致的测试错误。 我花了数小时来解决Spring 2.3.3.RELEASE的ddl初始化问题,而没有找到常规解决方案。