我有一个Spring Boot
2.5.0项目。我使用Spring Data JPA
和H2
in-memory 数据库。我想在启动时用data.sql
文件填充数据,但我得到了一个未找到表的异常。如果删除data.sql
文件,可以看到实体的表会自动创建。但是如果我包含data.sql
文件,我会得到错误消息,说表不存在。也许是我的sql语法错误,我错误地配置了H2
数据库?
- applicaltion.yml*
spring:
datasource:
url: jdbc:h2:mem:test
driverClassName: org.h2.Driver
username: sa
password: sa
jpa:
database-platform: org.hibernate.dialect.H2Dialect
debug: true
- data.sql*
INSERT INTO BUSINESS_SUMMARY VALUES (1, "ALM470", "B48", 3);
- BusinessSummary.java实体 *
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class BusinessSummary {
@Id
private Long id;
private String businessId;
private String businessDomainId;
private Integer cityCode;
}
- BusinessSummaryRepository.java*
@Repository
public interface BusinessSummaryRepository extends JpaRepository<BusinessSummary, Long> {
}
- 例外情况:*
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "BUSINESS_SUMMARY" not found; SQL statement:
INSERT INTO BUSINESS_SUMMARY VALUES(1, "ALM470", "B48", 3) [42102-200]
4条答案
按热度按时间fcy6dtqo1#
默认情况下,
data.sql
脚本现在在Hibernate
初始化之前运行。这使基于脚本的基本初始化行为与Flyway
和Liquibase
的行为保持一致。如果要使用
data.sql
填充由Hibernate
创建的模式,请将spring.jpa. defer-configuration-initialization设置为true。虽然不建议混合使用数据库初始化技术,但这也允许您在通过data.sql
填充Hibernate
创建的模式之前,使用schema.sql
脚本在该模式上进行构建。你必须将
spring.jpa.defer-datasource-initialization
转换为yml。col17t5w2#
如果您使用hibernate作为JPA实现,我认为最好的方法是使用文件import.sql而不是data.sql作为数据库接口。
有关数据库初始化的更多信息,请参阅官方Sping Boot 文档数据库初始化
axkjgtzd3#
除了延迟初始化之外:真的,你可能还需要
6kkfgxo04#
如果仍然不工作尝试重命名文件从data.sql到import.sql