使用Spring HibernateTemplate。如何删除ID?

时间:2012-01-23 11:07:28

标签: java hibernate spring

对于使用数据库,我的类扩展了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)

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

5 个答案:

答案 0 :(得分:34)

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

}

还要考虑在try / catch / finally中对这些方法进行encapuslate,并根据需要记录错误

答案 1 :(得分: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();
}

答案 2 :(得分:8)

如前所述,HibernateTemplate中没有这样的方法。您可以执行以下操作,

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

答案 3 :(得分:6)

您还可以使用以下方法:

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

答案 4 :(得分:1)

通过创建对象并仅设置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); 
 }

这将发出(如果你有级联属性表)删除子属性。