В настоящее время мы планируем очистить существующие данные в определенные моменты времени путем усечения таблиц. Это нормально?
Если вы не используете кэш второго уровня и если вы не загружали сущности из таблицы, которую вы собираетесь урезать в сеансе, должно работать следующее (при условии, что оно не нарушает ограничения целостности):
Session s = sf.openSession();
PreparedStatement ps = s.connection().prepareStatement("TRUNCATE TABLE XXX");
ps.executeUpdate();
И после этого вы сможете сохранять сущности либо в той же транзакции, либо в другой.
Конечно, такой TRUNCATE не будет генерировать какое-либо событие Hibernate или вызывать любой обратный вызов , если это имеет значение.
(...) при вставке мы генерируем первичные ключи, используя @GeneratedValue
(...)
Hibernate
Если вы используете значение по умолчанию strategy
для @GeneratedValue
(то есть AUTO
), то по умолчанию оно должно соответствовать последовательности с Oracle, и последовательность не будет сброшена, если вы урежете таблицу или удалите записи.
Мы усекаем таблицы, такие как jdbcTemplate.execute ("TRUNCATE TABLE abc")
Это должно быть эквивалентно (в конечном итоге вы будете использовать то же базовое соединение JDBC, что и Hibernate).
Какую последовательность будет использовать Hibernate для вставок?
AFAIK, Hibernate генерирует для вас последовательность "hibernate_sequence"
по умолчанию, если вы не объявляете свою собственную.
Я думал, что это просто делает макс (поле) + 1 на столе?
Я так не думаю, и тот факт, что Hibernate не начинается заново с 1 после TRUNCATE
, кажется, подтверждает, что это не так. Я предлагаю активировать ведение журнала SQL, чтобы увидеть точные операторы, выполненные для вашей базы данных на INSERT.
Генератор, который мы указываем для @GeneratedValue
, является просто «фиктивным» генератором (не соответствует ни одной последовательности, которую мы создали).
Я не уверен на 100%, но если вы не объявили ничего @SequenceGenerator
(или @TableGenerator
), я не думаю, что указание генератора что-то изменит.