Оптимизация гибернации для удаления нескольких объектов

#hibernate

#гибернация

Вопрос:

В приложении Java EE с гибернацией в большой таблице я хочу очистить несколько миллионов объектов.

Например

  1. Я получаю некоторые объекты, которые хочу очистить: 2000 объектов вернули более 5000 объектов на вкладке
  2. а затем я хочу их удалить

На самом деле, пока объект существует, я делаю:

         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();
}
  

Я предполагаю, что гибернация удаляет все объекты при фиксации транзакции, а не по одному.

  1. Каково наилучшее решение для удаления, например, 2000 объектов и отсутствия исключений памяти или гибернации?

  2. Как удалить действительно один за другим с помощью гибернации?

Ответ №1:

Не извлекайте их, просто используйте некоторые критерии для удаления. Используйте HQL для таких случаев

 session.createQuery("delete from MyClass where ...").setXXX(...).executeUpdate();
  

Комментарии:

1. Итак, если запрос HQL возвращает 2000 объектов, у него не будет проблем с гибернацией или памятью?

2. Когда вы удаляете его с помощью HQL, они не загружаются, они просто удаляются.

3. И если мое удаление HQL должно удалить 276 000 объектов, это сработает? : D

4. Он будет работать с любым количеством объектов. Hibernate просто преобразует команду в SQL и передает ее в базу данных, никакие объекты загружаться не будут.