web-dev-qa-db-fra.com

Utilisation de Spring HibernateTemplate. Comment supprimer par ID?

Pour travailler avec la base de données, ma classe étend la classe HibernateDaoSupport et les méthodes que j'utilise avec Spring HibernateTemplate.

Donc, pour supprimer une ligne dans la base de données, j'utilise cette méthode:

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

tout va bien!

Mais, en ce moment, j'essaie d'implémenter une méthode permettant de supprimer une ligne basée sur id:

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

Et je ne trouve pas de méthode HibernateTemplate comme celle-ci:
getHibernateTemplate().remove(id)

Quelle est la bonne solution pour moi dans ce cas?

12
user471011

supprimer en utilisant un identifiant particulier,

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

}

Considérez également encapuslate cette méthode dans try/catch/finally et enregistrez l'erreur si nécessaire

34
Kushan

Une autre alternative est:

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

Comme vous l’avez mentionné, il n’ya pas une telle méthode dans HibernateTemplate. Vous pouvez faire ce qui suit,

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

Vous pouvez également utiliser la méthode ci-dessous:

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

Il existe une solution simple en créant un objet et en définissant uniquement l'ID:

Product product = new Product();
product.setId(37);
session.delete(product);

L’inconvénient de cette solution simple est qu’elle ne supprime pas les instances associées.
Si vous devez supprimer un attribut (lié à une autre entité) du produit, vous devez le charger au préalable.

 Serializable id = new Long(17); 
 Object persistentInstance = session.load(Product.class, id); 
 if (persistentInstance != null) 
 {
   session.delete(persistentInstance); 
 }

Cela déclenchera (si vous avez une table attributaire en cascade) une suppression sur les attributs enfants.

1
maborg