Использование Spring HibernateTemplate. Как удалить по идентификатору? - PullRequest
12 голосов
/ 23 января 2012

Для работы с базой данных мой класс расширяет класс HibernateDaoSupport и внутри методов, которые я использую Spring HibernateTemplate.

Итак, для удаления строки в базе данных я использую этот метод:

public void delete(MyObject obj) {
    getHibernateTemplate().delete(obj);
}

все в порядке!

Но в данный момент я пытаюсь реализовать метод, который может удалить строку на основе идентификатора:

public void delete(final long id) {
    // some code here
}

И я могу 'Не могу найти какой-нибудь HibernateTemplate метод, подобный этому:
getHibernateTemplate().remove(id)

Какое для меня хорошее решение в этом случае?

Ответы [ 5 ]

34 голосов
/ 23 января 2012

удалить с использованием определенного идентификатора,

public void delete(long id)
{
    Session session ;
    MyObject myObject ;

    session = sessionFactory.getCurrentSession();
    myObject = (MyObject)session.load(MyObject.class,id);
    session.delete(myObject);

    //This makes the pending delete to be done
    session.flush() ;

}

Также рассмотрите возможность инкапсуляции этих методов в try / catch / finally и зарегистрируйте ошибку при необходимости

11 голосов
/ 28 октября 2014

Другая альтернатива:

public void deleteById(Class clazz,Integer id) {
    String hql = "delete " + clazz.getName() + " where id = :id";
    Query q = session.createQuery(hql).setParameter("id", id);
    q.executeUpdate();
}
8 голосов
/ 23 января 2012

Как вы упомянули, в HibernateTemplate такого метода нет. Вы можете сделать следующее,

hibernateTemplate.delete(hibernateTemplate.get(Class,Id));
6 голосов
/ 14 января 2014

Вы также можете использовать метод ниже:

public void deleteById(Class clazz,Integer id) {
    hibernateTemplate.bulkUpdate("delete from "+clazz.getName()+" where id="+id);
}
1 голос
/ 04 октября 2016

Существует простое решение: создать объект и установить только идентификатор:

Product product = new Product();
product.setId(37);
session.delete(product);

Недостаток этого простого решения заключается в том, что оно не удаляет связанные экземпляры.
Если у вас есть какой-либо атрибут (связанный с другим объектом) продукта, который нужно удалить, вам нужно будет загрузить продукт до этого.

 Serializable id = new Long(17); 
 Object persistentInstance = session.load(Product.class, id); 
 if (persistentInstance != null) 
 {
   session.delete(persistentInstance); 
 }

Это приведет к удалению (если у вас есть таблица атрибутов в каскаде) удаления дочерних атрибутов.

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