2013-02-25 15 views
7

Ho il seguente codice:Interrogazione Hibernate cache di

Person a = new Person(); 
a.setName("John"); 

Session session = openHibernateSession(); 

session.beginTransaction(); 

session.saveOrUpdate(a); 

Criteria critera = session.createCriteria(Person.class); 
critera.add(Restrictions.eq("name","John")); 
Person personFromCache = (Person) criteria.uniqueResult(); 

... 

session.commit(); 

Quello che voglio è avere la capacità di ricercare oggetti sia il database e la cache di Hibernate. L'esempio seguente restituisce null alla chiamata uniqueResult. C'è un modo per recuperare oggetti salvati che non sono stati ancora impegnati nel database?

risposta

1

Se si sta eseguendo una ricerca diversa dall'ID, Hibernate non utilizzerà la cache di primo livello. Hibernate get e load è correlato alla cache di primo livello per impostazione predefinita, ma la query sui criteri non lo è. Nel tuo caso ci sono due soluzioni da parte mia

  1. da vampate di calore session = Basta sciacquare la sessione come questo session.flush(); mentre si fa così i dati di sessione saranno sincronizzati alla banca dati da cui Id sarà ge generato e come query di criteri di risultato trova il risultato nel database e ti verrà elencato.

  2. Abilita cache di secondo livello di ibernazione = È possibile abilitare la cache di secondo livello da provider di cache di ibernazione come ehCache e applicare il trucco.

0

È possibile utilizzare lo StatelessSession ma attenzione: quei entitys non sono vincolati a qualsiasi sessione e otterrete eccezioni, se vi piace di risolvere le relazioni o campi pigri!

0
session.beginTransaction(); 

session.saveOrUpdate(a); 

session.flush(); 

Criteria critera = session.createCriteria(Person.class); 
critera.add(Restrictions.eq("name","John")); 
Person personFromCache = (Person) criteria.uniqueResult(); 
0

Facciamo alcune cose simili tranne l'utilizzo del framework di test di TestNg. Diverse risposte rispondono alla chiamata al metodo session.flush(). Questo è corretto. La chiamata a flush dice a Hibernate di fare diverse cose, incluso assicurandosi che tutte le chiamate di database attualmente in attesa nella coda vengano eseguite e cancellate dalla coda.

0

Restituisce i dati anche se si seleziona sulla base del nome utente. Non restituisce nulla.

Problemi correlati