Не могу обрезать таблицы PostgreSQL с помощью JPA - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь быстро удалить все данные из нескольких таблиц, используя Spring Data JPA. Из того, что я прочитал, самый быстрый способ сделать это - обрезать таблицы.

Мой код выглядит так:

@Service
public class DatabaseService {

    ... autowiring ...

    @Transactional
    public void deleteRepository(){
        repository.truncate();
    }
}
@Repository
public interface repository extends JpaRepository<Trip, Long> {

    @Modifying
    @Query(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.

Я также пытался использовать другие методы для удаления данных, например DELETE FROM my_table (my_table содержит около 2 миллионов записей), но это занимает слишком много времени. Я бы оценил любые советы.

1 Ответ

0 голосов
/ 28 мая 2019

Если у вас есть взаимосвязь между таблицами, вы не сможете TRUNCATE таблиц, потому что это исключение нарушения целостности данных, если вы используете базу данных H2, есть ли у вас что-то вроде хитрости, которую вы можете сделать:

SET REFERENTIAL_INTEGRITY FALSE;

TRUNCATE TABLE tbtable;

SET REFERENTIAL_INTEGRITY TRUE;

.sql

...