2011-09-19 11 views
6

Desidero poter verificare se una sessione contiene un'entità di una determinata classe/identificatore. Non riesco a vedere un modo per farlo al momento.Hibernate session.contains (Class clazz, ID serializzabile)

  • prende un oggetto entità non classe + tasto
  • get() interroga il database se l'entità non è presente che io non voglio fare
  • load() mai restituisce null come proxy viene sempre creato in modo Non riesco a utilizzare questo metodo

È possibile eseguire quanto sopra senza effetti collaterali/query su DB?

+0

Solo per curiosità - perché avete bisogno di sapere se l'oggetto con l'identificatore data è nella sessione? Non puoi semplicemente fare 'get (id)' e fare affidamento sul fatto che se l'oggetto è già in Session, Hibernate restituirà quell'istanza senza interrogare di nuovo? –

+0

In questo caso sto cercando di fare in modo che l'ibernazione interagisca con alcune cache personalizzate ma solo in istanze molto specifiche, il più delle volte sono felice per il comportamento predefinito di colpire il DB, quindi voglio verificare la presenza di un oggetto presente , se non lo carica dalla cache. La chiave è che non posso disturbare nulla già nella sessione in quanto potrebbero esservi riferimenti da altri oggetti con riferimenti molti-a-uno. –

+0

@MikeQ Avevi assolutamente ragione su come funziona IdentityMap, quindi la mia risposta è stata cancellata. – Marcelo

risposta

1

Rispondere alla mia domanda.

Non credo sia possibile con le API pubbliche. Tuttavia, se si è disposti a tollerare qualche formaggio è possibile effettuare le seguenti operazioni

 SessionImplementor sessionImplementor = ((SessionImplementor)session); 
     EntityPersister entityPersister = sessionImplementor.getFactory().getEntityPersister(clazz.getName()); 
     PersistenceContext persistenceContext = sessionImplementor.getPersistenceContext(); 

     EntityKey entityKey = new EntityKey(id, entityPersister, EntityMode.POJO); 

     Object entity = persistenceContext.getEntity(entityKey); 

     if (entity != null) 
      return entity; 

     entity = persistenceContext.getProxy(entityKey); 

     if (entity != null) 
      return entity; 

     return null; 

Questo si basa sulle API interne di ibernazione in modo non può funzionare, in futuro, se cambia internamente.

1

Non che io sappia. La sessione controllerà sempre il DB se si tenta di ottenere un'entità di un particolare tipo e id e non la contiene.

In effetti questa è una delle cose positive del modello. Non devi preoccuparti di dove JPA/Hibernate ottiene l'oggetto, cache (1 ° o 2 ° livello) o DB.

Se si dispone di un'entità in memoria, è possibile verificare se è distinta dalla sessione ma non se è nella sessione.

0

Utilizzare getIdentifier(..). Restituisce il valore identificativo dell'entità data come associato alla sessione corrente, vedere Javadoc.

+0

Non è quello che sto chiedendo. –

3

Questo funziona:

public boolean isIdLoaded(Serializable id) 
{ 
    for (Object key : getSession().getStatistics().getEntityKeys()) 
    { 
     if (((EntityKey) key).getIdentifier().equals(id)) 
     { 
      return true; 
     } 
    } 

    return false; 
} 
Problemi correlati