2012-01-23 23 views
10

为了使用数据库,我的课程扩展了HibernateDaoSupport类,并且在我使用Spring的方法HibernateTemplate中。使用Spring HibernateTemplate。如何通过ID删除?

所以,删除一行在数据库中,我用这个方法:

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

一切OK!

但是,在这一刻,我想实现,可以根据ID删除行的方法:

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

我不能找到一些HibernateTemplate方法是这样的:
getHibernateTemplate().remove(id)

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

回答

28

删除使用特定的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 /终于,并根据需要

+1

这似乎是最优雅的解决方案(不使用sql/hql查询),但它看起来似乎相当无效,因为它似乎是为了删除整个对象而产生的。是这样吗?我如果是这样,可以做些什么? –

+0

如果id不存在,myObject将为空,并且delete()可能会导致错误? – NingLee

+0

@NingLee是的,你会因加载而得到一个异常,认为该对象存在。如果你想避免这样的异常使用'get'而不是'load' –

7

至于你提到在错误日志中,有不是在HibernateTemplate的这样的方法。你可以做到以下几点,

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

哇,这需要照顾级联删除! – Jess

6

您还可以使用以下方法:

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

另一种方法是:

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

这将问题(如果你有一个级联属性表)删除子属性。