Использование Spring HibernateTemplate. Как удалить по идентификатору?

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

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

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

все нормально!

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

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

И я не могу найти какой-то метод HibernateTemplate:
getHibernateTemplate().remove(id)

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

Ответ 1

удалить с помощью определенного id,

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

}

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

Ответ 2

Другой вариант:

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

Ответ 3

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

hibernateTemplate.delete(hibernateTemplate.get(Class,Id));

Ответ 4

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

public void deleteById(Class clazz,Integer id) {
    hibernateTemplate.bulkUpdate("delete from "+clazz.getName()+" where id="+id);
}

Ответ 5

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

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

Это приведет к выпуску (если у вас есть таблица атрибутов в каскаде) удаление атрибутов children.