Spring Can';t使用JPA截断PostgreSQL表

Spring Can';t使用JPA截断PostgreSQL表,spring,postgresql,hibernate,jpa,spring-data-jpa,Spring,Postgresql,Hibernate,Jpa,Spring Data Jpa,我正在尝试使用SpringDataJPA快速删除多个表中的所有数据。据我所知,最快的方法是截断表 我的代码如下所示: @服务 公共类数据库服务{ …自动布线。。。 @交易的 公共存储库(){ truncate(); } } @存储库 公共接口存储库扩展了JpaRepository{ @修改 @查询(value=“truncate table my_table”, nativeQuery=true) void truncate(); } 但是,当我调用deleteRepository()方法时

我正在尝试使用SpringDataJPA快速删除多个表中的所有数据。据我所知,最快的方法是截断表

我的代码如下所示:

@服务
公共类数据库服务{
…自动布线。。。
@交易的
公共存储库(){
truncate();
}
}
@存储库
公共接口存储库扩展了JpaRepository{
@修改
@查询(value=“truncate table my_table”,
nativeQuery=true)
void truncate();
}
但是,当我调用
deleteRepository()
方法时,会出现以下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'databasePopulatorJob': Invocation of init method failed; nested exception is org.springframework.transaction.TransactionSystemException: Could not roll back JPA transaction; nested exception is org.hibernate.TransactionException: Unable to rollback against JDBC Connection
...
Caused by: org.springframework.transaction.TransactionSystemException: Could not roll back JPA transaction; nested exception is org.hibernate.TransactionException: Unable to rollback against JDBC Connection
...
Caused by: org.hibernate.TransactionException: Unable to rollback against JDBC Connection
...
Caused by: java.sql.SQLException: Connection is closed
...
我正在使用最新的PostgreSQL数据库和JDBC驱动程序版本42.2.5


我还尝试了其他方法来删除数据,如从我的表中删除(我的表包含大约200万条记录),但时间太长了。我很乐意接受任何提示。

如果表之间存在关系,则无法截断表,因为是数据整数冲突异常,如果您使用的是数据库H2,则可以执行以下操作:

SET REFERENTIAL_INTEGRITY FALSE;

TRUNCATE TABLE tbtable;

SET REFERENTIAL_INTEGRITY TRUE;

.sql

如果表之间存在关系,则无法截断表,因为存在数据整数冲突异常,如果使用的是数据库H2,则可以执行以下操作:

SET REFERENTIAL_INTEGRITY FALSE;

TRUNCATE TABLE tbtable;

SET REFERENTIAL_INTEGRITY TRUE;

.sql

尝试在存储库界面中使用@Transactional at truncate。如果直接在数据库上执行该命令,该命令是否有效?当询问异常时,请发布完整准确的异常堆栈跟踪。看起来你正在尝试在创建bean时使用你的存储库,而不是等到应用程序初始化后再使用。我设法解决了这个问题。我不确定我到底做了什么,但我忘记了我在中调用的
deleteRepository()
方法是用
@Transactional
注释的,所以我删除了注释。此外,我将查询更改为
截断表my_表级联
。现在删除基本上是即时的。请尝试在存储库界面中使用@Transactional at truncate。如果您直接在数据库上执行该命令,它会起作用吗?当询问异常时,请发布完整准确的异常堆栈跟踪。看起来你正在尝试在创建bean时使用你的存储库,而不是等到应用程序初始化后再使用。我设法解决了这个问题。我不确定我到底做了什么,但我忘记了我在中调用的
deleteRepository()
方法是用
@Transactional
注释的,所以我删除了注释。此外,我将查询更改为
截断表my_表级联
。现在删除基本上是即时的。