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