2012-01-23 22 views
10

Per il lavoro con database, la mia classe estende la classe HibernateDaoSupport e all'interno dei metodi che utilizzo Spring HibernateTemplate.Utilizzo di Spring HibernateTemplate. Come eliminare da ID?

Quindi, per eliminare una riga nel database Io uso questo metodo:

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

tutto ok!

Ma, in questo momento sto cercando di implementare un metodo che può eliminare una riga basata su ID:

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

E non riesco a trovare un po 'di HibernateTemplate metodo come questo:
getHibernateTemplate().remove(id)

Qual è una buona soluzione per me in questo caso?

risposta

28

eliminare utilizzando particolari 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() ; 

} 

Considera anche encapuslate questo metodi in try/catch/finally e del registro degli errori, se necessario

+1

Questa sembra la soluzione più elegante (senza utilizzare query sql/hql), ma sembra piuttosto inefficiente in quanto sembra correggere l'intero oggetto per eliminarlo. È questo il caso? Se sì, cosa si può fare? –

+0

Se id non esiste, 'myObject' sarà null e' delete() 'potrebbe causare un errore? – NingLee

+0

@NingLee sì, si ottiene un'eccezione dovuta al carico che considera che l'oggetto esiste. Se vuoi evitare tale eccezione usa 'get' piuttosto che' load' –

7

Come lei ha ricordato, non ci s tale metodo in HibernateTemplate. È possibile effettuare le seguenti operazioni,

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

Wow, questo si occupa anche dell'eliminazione a cascata !! – Jess

6

È inoltre possibile utilizzare di seguito il metodo:

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

Un'altra alternativa è:

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

C'è una soluzione semplice per la creazione di un oggetto e l'impostazione solo l'ID:

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

Lo svantaggio di questa semplice soluzione è che non rimuove le istanze associate.
Se si dispone di un attributo (un'altra entità correlata) del prodotto da eliminare, sarà necessario caricare prima il prodotto.

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

Questo emetterà (se si dispone di una tabella di attributi in cascata) un eliminare sui bambini attributi.

Problemi correlati