提问人:Heiducken 提问时间:11/6/2023 更新时间:11/6/2023 访问量:30
Hibernate Mysql 测试数据库引擎[*]=InnoDB;预期的“标识符”
Hibernate Mysql Testdatabase engine[*]=InnoDB; expected "identifier"
问:
我正在尝试使用Mysql数据库使用Spring Boot。目前我正在尝试测试我的项目,但遇到了以下问题:
我想使用架构 .sql 设置我的表,如下所示
CREATE TABLE IF NOT EXISTS `Ausgaben` (
ID TIMESTAMP NOT NULL,
AMOUNT INT DEFAULT NULL,
PLACE VARCHAR(20) DEFAULT NULL,
DATUM DATE DEFAULT NULL,
CATEGORY varchar(20) DEFAULT NULL,
primary key (ID)
);
我的application.properties:
spring.datasource.url=jdbc:h2:mem:test;MODE=MySQL;
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=testuser
spring.datasource.password=passwort
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.h2.console.enabled=true
spring.jpa.defer-datasource-initialization=true
spring.jpa.hibernate.ddl-auto=update
spring.sql.init.mode=always
我的实体看起来像这样:
@Entity
@Table(name = "Ausgaben")
data class AusgabeEntity(
@Id
val id: Timestamp,
val amount: Double,
val place: String,
val datum: LocalDate,
val category: String
)
我的测试如下所示:
@Test
fun `post method creates an Ausgabe-Entity in Repository`(){
Assertions.assertEquals(0, ausgabeRepository.count())
logger.info(ausgabeRepository.count().toString())
mockMvc.perform(MockMvcRequestBuilders.post("/save?amount=10&place=lidl&category=haushalt"))
.andExpect(MockMvcResultMatchers.status().isOk)
Assertions.assertEquals(1, ausgabeRepository.count())
logger.info(ausgabeRepository.count().toString())
logger.info(ausgabeRepository.findAll().toString())
}
测试有效,但在堆栈跟踪中,它在执行我的架构 .sql 时说:
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table ausgaben (id datetime(6) not null, amount float(53) not null, category varchar(255), datum date, place varchar(255), primary key (id)) engine=InnoDB" via JDBC [Syntax Fehler in SQL Befehl "create table ausgaben (id datetime(6) not null, amount float(53) not null, category varchar(255), datum date, place varchar(255), primary key (id)) engine[*]=InnoDB"; erwartet "identifier"
Syntax error in SQL statement "create table ausgaben (id datetime(6) not null, amount float(53) not null, category varchar(255), datum date, place varchar(255), primary key (id)) engine[*]=InnoDB"; expected "identifier";]
所以看起来 spring 将“engine=InnoDB”附加到我的表定义中,然后无法读取它?
有人可以解释一下,这里发生了什么吗?
感谢您的帮助
当我将架构 .sql 更改为
CREATE TABLE IF NOT EXISTS `Ausgaben` (
ID TIMESTAMP NOT NULL,
AMOUNT INT DEFAULT NULL,
FAILURE VARCHAR(10) NOT NULL,
PLACE VARCHAR(20) DEFAULT NULL,
DATUM DATE DEFAULT NULL,
CATEGORY varchar(20) DEFAULT NULL,
primary key (ID)
);
我可以看到,测试失败
jakarta.servlet.ServletException: Request processing failed: org.springframework.dao.DataIntegrityViolationException: could not execute statement [NULL nicht zulässig für Feld "FAILURE"
NULL not allowed for column "FAILURE"; SQL statement:
insert into ausgaben (amount,category,datum,place,id) values (?,?,?,?,?) [23502-224]] [insert into ausgaben (amount,category,datum,place,id) values (?,?,?,?,?)]; SQL [insert into ausgaben (amount,category,datum,place,id) values (?,?,?,?,?)]; constraint [null]
看起来,好像它确实构建了桌子。所以我不明白为什么它会抛出语法错误。
答:
0赞
Barmaglot
11/6/2023
#1
将 org.hibernate.dialect.H2Dialect 用于 spring.jpa.database-platform
评论