Удалить () и Удалить все () в Hibernate - PullRequest
4 голосов
/ 01 марта 2012

Рассмотрим два нижеприведенных способа удаления набора сотрудников с именем «Джон».

List<Employee> list = new ArrayList<Employee>();
String query=   " from Employee emp where emp.name = 'John'";
list=getHibernateTemplate().find(query);

Первый метод:

 getHibernateTemplate().deleteAll(list);

Второй метод:

Iterator<BulkChangeRequest> itList = list.iterator();
    while(itList.hasNext()) {
        Employee emp = itList.next();
        getHibernateTemplate().delete(emp);
    }

Отличаются ли они значительно с точки зрения производительности? Являются ли они по сути одинаковыми, то есть метод deleteAll удаляет строку один за другим?

Также не лучше ли сделать это в SQL, используя следующий запрос?

" delete from Employee where name = 'John'"

Ответы [ 2 ]

1 голос
/ 01 ноября 2017

Предлагаю вам прочитать этот раздел, one shot delete:

https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/performance.html#performance-collections-oneshotdelete

Удаление элементов коллекции по одному иногда может быть чрезвычайно неэффективен. Hibernate знает, что нельзя делать в случае вновь пустая коллекция (например, если вы вызвали list.clear ()). В в этом случае Hibernate выдаст один DELETE.

1 голос
/ 01 марта 2012

Да.Было бы лучше использовать SQL или HQL, чтобы удалить все записи сотрудников с именем «Джон», а не первый вариант.Просто потому, что в первом варианте вы должны загрузить все записи сотрудника из БД для удаления.Это очевидно дополнительная задача.

Я думаю, для delete() и deleteAll() не будет никакой разницы, кроме delete(), он будет создавать новый сеанс для каждого вызова;тогда как в deleteAll() все объекты будут удалены за один сеанс.Но количество запросов будет одинаковым.

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