对于使用数据库,我的类扩展了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)
在这种情况下,对我来说什么是好的解决方案?
答案 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);
}
这将发出(如果你有级联属性表)删除子属性。