Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 在启动Spring引导时导入数据_Spring Boot_Hibernate_Spring Data Jpa - Fatal编程技术网

Spring boot 在启动Spring引导时导入数据

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

我试图在数据库初始化时启动一个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: 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')