Как реализовать ALTER TABLE Query с использованием Spring Data Jpa или Hibernate - PullRequest
0 голосов
/ 09 ноября 2019

Я вставляю файл CSV в таблицу базы данных, используя Spring Batch и Spring Data (и Hibernate). каждый раз, когда я вставляю CSV, мне нужно удалить предыдущие данные в таблице, используя метод data-jpa deleteAll (). проблема заключается в том, что идентификаторы таблицы увеличиваются автоматически и непрерывно (@GeneratedValue (стратегии = GenerationType.IDENTITY)) после каждого оператора удаления / вставки. Я хочу, чтобы после каждого удаления идентификаторы начинались с 1. Единственный способ, который я нашел, - это изменить индекс (я знаю, что это не лучший способ, поэтому ваши предложения приветствуются). Вопрос:
естьлюбой метод для запуска этого запроса SQL

ALTER TABLE res AUTO_INCREMENT=1;

в объекте Java, используя Spring Data или Hibernate? Спасибо

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Вместо изменения таблицы я настроил способ, которым Hibernate генерирует идентификаторы.

вместо использования:

@GeneratedValue(strategy = GenerationType.IDENTITY)

Я реализовал собственный генератор идентификаторов:

@GenericGenerator(name = "sequence_id", strategy = 
"com.xyz.utils.CustomIdGenerator",
            parameters = {
                   @org.hibernate.annotations.Parameter(
                    name = "table_name", value = "myTable")
            })
@GeneratedValue(generator = "sequence_id")  

класс CustomIdGenerator:

public class CustomIdGenerator  implements IdentifierGenerator,Configurable{

private    String  table_name ;

@Override
public Serializable generate(SharedSessionContractImplementor session, Object object) 
        throws HibernateException {

    Connection connection = session.connection();

    try {
        Statement statement=connection.createStatement();
        ResultSet rs=statement.executeQuery("select count(id) as Id from " 
    +table_name );

        if(rs.next())
        {
            int id=rs.getInt(1)+1;
            Integer generatedId = new Integer(id);
            System.out.println("Generated Id: " + generatedId);
            return generatedId;
        }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}

@Override
public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) 
    throws MappingException {
    setTable_name(params.getProperty("table_name"));    }

//getters and setters    
}

проблема этого решения заключается в выполнении выбора для каждого идентификатора, поэтому кажется, что он генерирует нагрузку на СУБД и замедляет ее. и rs повторяется дважды для первого id (). Любое предложение по оптимизации приветствуется

0 голосов
/ 10 ноября 2019

Можно ли сгенерировать идентификатор на стороне Java и не использовать встроенную функцию автоинкремента БД?

Так что лучшим способом будет явное генерирование идентификатора и его установка на сущность.

Другоеслучаи:

Усеченная таблица

TRUNCATE TABLE table_name;

Это приведет к сбросу автоматического приращения в таблице, а также к удалению всех записей из этой таблицы.

Удаление и воссоздание

Таблица DROP TABLE table_name;

CREATE TABLE table_name {...};

Так что я думаю, второе - это то, что вы ищете

...