Hibernate Удалить объект по id - PullRequest
5 голосов
/ 28 февраля 2012

Какой метод (с точки зрения производительности) является лучшим для удаления объекта, если доступен только его идентификатор.

  1. HQL. Будет ли выполнение этого HQL загружать объект SessionContext в постоянный контекст гибернации?

    for(int i=0; i<listOfIds.size(); i++){
        Query q = createQuery("delete from session_context where id = :id ");
            q.setLong("id", id);
            q.executeUpdate();
    }
    
  2. Загрузка по идентификатору и удаление.

    for(int i=0; i<listOfIds.size(); i++){
        SessionContext session_context = (SessionContext)getHibernateTemplate().load(SessionContext.class, listOfIds.get(i));
        getHibernateTemplate().delete(session_context) ;
    }
    

Здесь SessionContext - это объект, сопоставленный с таблицей session_context. Или, конечно же, есть все вместе другой и лучший подход?

Ответы [ 3 ]

7 голосов
/ 28 февраля 2012

Из двух, первый лучше, где вы будете экономить память. Если вы хотите удалить сущность и у вас есть идентификатор, написание HQL является предпочтительным.

В вашем случае есть третий и лучший вариант,

Попробуйте ниже,

//constructs the list of ids using String buffer, by iterating the List.
String idList = "1,2,3,....."

Query q = createQuery("delete from session_context where id in (:idList) ");
q.setString("idList", idList);
q.executeUpdate();

Теперь, если в списке 4 элемента, будет запущен только один запрос, ранее было бы 4.

Примечание: - Чтобы вышеприведенное сработало, session_context должна быть независимой таблицей.

3 голосов
/ 07 апреля 2014

Кстати, скажите "нет" этой уродливой строке, есть .setParameterList (), поэтому:

List<Long> idList = Arrays.asList(1L, 2L, 3L);

Query q = createQuery("delete from session_context where id in (:idList) ");
q.setParameterList("idList", idList);
q.executeUpdate();

update Я должен обновить это, в нашей среде, в концеоказалось, что использование setParameterList дает гораздо худшую производительность, чем ручное создание строки и использование setString, как предложено @ManuPK.

2 голосов
/ 28 февраля 2012

Также следует рассмотреть кеширование - кэш первого уровня (сеанс) и второй уровень.

Первый вариант, вероятно, является лучшим, если удаление является единственной или первой операцией в транзакции.

Если вы запрашиваете некоторые объекты SessionContext, затем вызываете HQL для удаления, тогда все объекты в кеше запросов будут удалены, потому что hibernate не знает, какой удалить. Это не относится ко второму подходу.

Если вы используете кэш второго уровня, он становится еще более сложным и сильно зависит от того, что вы делаете с объектами SessionContext.

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