Хорошо усечь таблицы базы данных при использовании Hibernate? - PullRequest
0 голосов
/ 25 мая 2010

Можно ли усекать таблицы, одновременно используя Hibernate для вставки данных?

Мы анализируем большой XML-файл со многими связями в Hibernate POJO и сохраняем в БД.

В настоящее время мы планируем очистить существующие данные в определенные моменты времени путем усечения таблиц. Это нормально?

Это , кажется, работает нормально. Мы не используем кэш второго уровня Hibernate. Одна вещь, которую я заметил, и это хорошо, это то, что при вставке мы генерируем первичные ключи, используя @GeneratedValue Hibernate, где Hibernate просто использует значение ключа на единицу больше, чем самое высокое значение в таблице - и хотя мы усекаем таблицы, Hibernate запоминает предыдущее значение и использует предыдущее значение + 1, а не начинается с 1. Это нормально, просто неожиданно.

Обратите внимание, что причина, по которой мы выполняем усечение, а не вызов delete() в Hibernate POJO, заключается в скорости. У нас есть миллионы строк данных, и усечение намного быстрее.

Ответы [ 2 ]

2 голосов
/ 25 мая 2010

В настоящее время мы планируем очистить существующие данные в определенные моменты времени путем усечения таблиц. Это нормально?

Если вы не используете кэш второго уровня и если вы не загружали сущности из таблицы, которую вы собираетесь урезать в сеансе, должно работать следующее (при условии, что оно не нарушает ограничения целостности):

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), я не думаю, что указание генератора что-то изменит.

0 голосов
/ 25 мая 2010

Зависит от вашего приложения. Если удаление строк в базе данных является окей, то усечение тоже окей.

Поскольку у вас нет прослушивателей Pre или PostRemove в ваших сущностях, проблем не должно быть.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...