2012-02-28 2 views
5

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

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

    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. Загрузить по ID и удалить.

    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 таблицу. Или, конечно, есть ли все вместе разные и лучшие подходы?

ответ

7

Из двух лучше, чем первый, где вы будете экономить память. Если вы хотите удалить Entity, и у вас есть идентификатор с вами, предпочтительнее писать 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 должен быть независимой таблицей.

+0

спасибо, некоторые проблемы 1. у моего idList может быть около 1000 идентификаторов в заданное время. это будет проблема? 2. При выполнении удаления сначала попробуйте загрузить все объекты SessionContext в контекст сохранения для удаления, а затем продолжить удаление? – mohit052

+0

Для удаления объектов вам не нужно загружать их в сеанс. Он также должен работать с 1000 элементами, но сначала заработайте, а затем выполните улучшения производительности. – ManuPK

+0

спасибо. получил это :-D – mohit052

2

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

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

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

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

+1

, пожалуйста, не приносите ** кеширование ** здесь, ** OP ** Просто хотите удалить записи из таблицы поддержки, а не из кеша. Как вы сказали ** кеш второго уровня, это еще более сложно **, поэтому лучше не туда, если это возможно !. – ManuPK

+0

Нет второго кэширования здесь :-). Спасибо, что все прояснилось. – mohit052

3

Btw, скажем, не к той безобразной строки, нет .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(); 

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