#hibernate
#гибернация
Вопрос:
В приложении Java EE с гибернацией в большой таблице я хочу очистить несколько миллионов объектов.
Например
- Я получаю некоторые объекты, которые хочу очистить: 2000 объектов вернули более 5000 объектов на вкладке
- а затем я хочу их удалить
На самом деле, пока объект существует, я делаю:
List<Object> objectList = this.getObjectManager()
.getObjectsByCriteria(clientName, objectType, MAX_OBJECTS);
for (final Object object : objectList) {
if (logger.isDebugEnabled()) {
logger.debug("will delete " object);
}
this.getMManager().removeEntry(object);
counter ;
}
public void removeObject(final Object object) {
final Session session = this.getHibernateUtil().getSession();
session.delete(entry);
session.flush();
}
Я предполагаю, что гибернация удаляет все объекты при фиксации транзакции, а не по одному.
-
Каково наилучшее решение для удаления, например, 2000 объектов и отсутствия исключений памяти или гибернации?
-
Как удалить действительно один за другим с помощью гибернации?
Ответ №1:
Не извлекайте их, просто используйте некоторые критерии для удаления. Используйте HQL для таких случаев
session.createQuery("delete from MyClass where ...").setXXX(...).executeUpdate();
Комментарии:
1. Итак, если запрос HQL возвращает 2000 объектов, у него не будет проблем с гибернацией или памятью?
2. Когда вы удаляете его с помощью HQL, они не загружаются, они просто удаляются.
3. И если мое удаление HQL должно удалить 276 000 объектов, это сработает? : D
4. Он будет работать с любым количеством объектов. Hibernate просто преобразует команду в SQL и передает ее в базу данных, никакие объекты загружаться не будут.