Spring boot 在启动Spring引导时导入数据
我试图在数据库初始化时启动一个SQL文件 以下是我的配置:Spring boot 在启动Spring引导时导入数据,spring-boot,hibernate,spring-data-jpa,Spring Boot,Hibernate,Spring Data Jpa,我试图在数据库初始化时启动一个SQL文件 以下是我的配置: spring: profiles: local jpa: properties: hibernate.temp.use_jdbc_metadata_defaults: false generate-ddl: true hibernate: ddl-auto: update database: h2 show-sql: true autoCommit: fal
spring:
profiles: local
jpa:
properties:
hibernate.temp.use_jdbc_metadata_defaults: false
generate-ddl: true
hibernate:
ddl-auto: update
database: h2
show-sql: true
autoCommit: false
datasource:
platform: h2
url: jdbc:h2:mem:db;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;
driver-class-name: org.h2.Driver
initialization-mode: always
data: classpath:/sql/CreateGeographicZones.sql
我的脚本就是这一行(atm):
以及相关实体:
@NoArgsConstructor
@Data
@Entity
@Table(name = "GEOGRAPHIC_ZONE")
public class GeographicZone {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "geo_zone_sequence")
@SequenceGenerator(name = "geo_zone_sequence", sequenceName = "geo_zone_id_seq", allocationSize = 1)
@Column(nullable = false)
private Long id;
...
}
该表是按照我在日志中看到的方式创建的:
Hibernate:创建表地理分区(id bigint不为null,name varchar(100)不为null,主键(id))
但在执行脚本时,我有一个SQL错误:
Table "GEOGRAPHIC_ZONE" not found; SQL statement:
INSERT INTO GEOGRAPHIC_ZONE (name) VALUES ('EUROPE')
在日志中,我可以看到我的表是在脚本执行之前创建的,所以为什么它不工作?您没有显示如何定义
id
列,但架构表明没有自动生成方案。因此,请尝试:
插入地理区域(id、名称)值(1,“欧洲”);
在您的数据文件中。如果这样做有效,您需要在insert中手动设置
id
,或者在@GeneratedValue(strategy=AUTO)
属性中添加类似@id
的内容。您没有显示如何定义id
列,但架构表明没有自动生成方案。因此,请尝试:
插入地理区域(id、名称)值(1,“欧洲”);
在您的数据文件中。如果有效,您需要在插入中手动设置
id
,或者向@id
属性添加类似@GeneratedValue(strategy=AUTO)
的内容。根据实体的元数据,Hibernate正在查询geo_zone_id_seq
序列的下一个值,并将其用于每个插入的id
如果希望在直接插入数据库时使用相同的方法,则需要实现
您还可以使用EntityManager
bean或SpringJPA存储库在应用程序启动后通过接口插入数据
使用EntityManager
:
@Bean
CommandLineRunner registerZonesDataRunner(EntityManager EntityManager,TransactionTemplate TransactionTemplate){
return args->transactionTemplate.execute(newtransactioncallbackwithoutresult()){
@凌驾
受保护的void doInTransactionWithoutResult(事务状态){
//假设GeographicZone有一个需要名称的构造函数
“非洲”、“欧洲”流
.map(GeographicOne::新建)
.forEach(entityManager::persist);
}
});
使用Spring JPA存储库:
@Bean
CommandLineRunner registerZonesDataRunner(地理位置存储库){
//假设GeographicZone有一个需要名称的构造函数
return args->repository.saveAll(Stream.of(“非洲”、“欧洲”)
.map(GeographicOne::新建)
.collector(Collectors.toList());
}
根据您实体的元数据,Hibernate正在查询
geo\u zone\u id\u seq
序列的下一个值,并将其用于每次插入时的id
如果希望在直接插入数据库时使用相同的方法,则需要实现
您还可以使用EntityManager
bean或SpringJPA存储库在应用程序启动后通过接口插入数据
使用EntityManager
:
@Bean
CommandLineRunner registerZonesDataRunner(EntityManager EntityManager,TransactionTemplate TransactionTemplate){
return args->transactionTemplate.execute(newtransactioncallbackwithoutresult()){
@凌驾
受保护的void doInTransactionWithoutResult(事务状态){
//假设GeographicZone有一个需要名称的构造函数
“非洲”、“欧洲”流
.map(GeographicOne::新建)
.forEach(entityManager::persist);
}
});
使用Spring JPA存储库:
@Bean
CommandLineRunner registerZonesDataRunner(地理位置存储库){
//假设GeographicZone有一个需要名称的构造函数
return args->repository.saveAll(Stream.of(“非洲”、“欧洲”)
.map(GeographicOne::新建)
.collector(Collectors.toList());
}
我在类中有一个带有@GeneratedValue的id,它与我所有的控制器都很好地工作,只是脚本根本找不到我的表你的@GeneratedValue策略是什么?我在我的问题中添加了它,但正如我之前所说的,当我通过Rest端点(也没有id)按顺序插入时,它工作得很好,有一个单独的表(默认情况下休眠_序列)这是序列中的下一个。Spring JPA正在查询此表,并在insert中使用ID的结果。如果要使用SQL进行insert而不指定IDI,则使用AUTO在类中使用带有@GeneratedValue的ID,它可以与我的所有控制器一起工作,只是脚本根本找不到我的表@GeneratedValue是什么策略?我在我的问题中添加了它,但正如我之前所说的,当我使用序列通过Rest端点(也没有id)插入时,它工作得很好,有一个单独的表(默认情况下为hibernate_序列)这是序列中的下一个。Spring JPA正在查询此表并在insert中使用ID的结果。如果要使用SQL插入而不指定ID,请使用AUTO
Table "GEOGRAPHIC_ZONE" not found; SQL statement:
INSERT INTO GEOGRAPHIC_ZONE (name) VALUES ('EUROPE')