使用Spring HibernateTemplate.如何删除ID?

use*_*011 12 java spring hibernate

对于使用数据库,我的类扩展了HibernateDaoSupport类,并在我使用Spring的方法内部HibernateTemplate.

因此,为了删除数据库中的一行,我使用以下方法:

public void delete(MyObject obj) {
    getHibernateTemplate().delete(obj);
}
Run Code Online (Sandbox Code Playgroud)

一切都好!

但是,此时我正在尝试实现一个可以删除基于id的行的方法:

public void delete(final long id) {
    // some code here
}
Run Code Online (Sandbox Code Playgroud)

我找不到HibernateTemplate像这样的方法:
getHibernateTemplate().remove(id)

在这种情况下,对我来说什么是好的解决方案?

Kus*_*han 35

使用特定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() ;

}
Run Code Online (Sandbox Code Playgroud)

还要考虑在try/catch/finally中包含此方法,并根据需要记录错误

  • 这似乎是最优雅的解决方案(不使用 sql/hql 查询),但它似乎效率很低,因为它似乎要删除整个对象以删除它。是这样吗?如果是这样,我可以做什么? (2认同)

Ger*_*ere 11

另一种选择是:

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();
}
Run Code Online (Sandbox Code Playgroud)


Adi*_*Adi 8

正如您所提到的,HibernateTemplate中没有这样的方法.你可以做到以下几点,

hibernateTemplate.delete(hibernateTemplate.get(Class,Id));
Run Code Online (Sandbox Code Playgroud)


小智 6

您也可以使用以下方法:

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