sto ottenendo questa eccezione in un controllore di un'applicazione web basata su framework primavera usando Hibernate. Ho provato molti modi per contrastarlo ma non ho potuto risolverlo.StaleObjectstateException riga è stata aggiornata o eliminata da
Nel metodo del controllore, handleRequestInternal
, ci sono chiamate fatte al database principalmente per "leggere", a meno che non sia un'azione di invio. ho utilizzato, sessione di primavera, ma si trasferì a getHibernateTemplate()
e il problema persiste.
in fondo, questa la seconda chiamata al database genera questa eccezione. Ovvero:
1) getEquipmentsByNumber(number)
{innanzitutto un dispositivo viene prelevato dal DB in base al 'numero', che ha un elenco di proprietà e ogni proprietà ha un elenco di valori. I loop through quei valori (oggetti primitivi stringhe) per leggere in alle variabili)
2) getMaterialById(id)
{recupera materiali a base di id}
Capisco che la seconda chiamata, molto probabilmente, sta facendo la sessione "filo", ma sono solo oggetti 'lettura', allora perché la seconda chiamata genera l'eccezione stato dell'oggetto stantio sulla proprietà Equipaggiamento se non è cambiato nulla?
non può cancellare la cache dopo la chiamata dal momento che provoca LazyExceptions su oggetti che passano alla vista.
Ho letto questo: https://forums.hibernate.org/viewtopic.php?f=1&t=996355&start=0 ma non ho potuto risolvere il problema in base ai suggerimenti forniti.
Come posso risolvere questo problema? Tutte le idee e pensieri sono apprezzati.
UPDATE: Quello che ho appena provato è che nella funzione getEquipmentsByNumber()
dopo aver letto le variabili da un elenco di proprietà, faccio questo: getHibernateTemplate().flush();
e ora l'eccezione è su questa linea piuttosto che la chiamata per andare a prendere il materiale (che è getMaterialById(id)
).
UPDATE: Prima di chiamare in modo esplicito a filo, sto rimuovendo l'oggetto dalla cache di sessione in modo che nessun oggetto stantio rimane nella cache.
getHibernateTemplate().evict(equipment);
getHibernateTemplate().flush();
OK, ora il problema si è spostato al successivo richiamo da DB dopo che ho fatto questo. Suppongo di dover etichettare i metodi come sincronizzati e sfrattare gli oggetti non appena ho finito di leggere il loro contenuto! non suona molto bene.
UPDATE: Realizzato il metodo handleRequestInternal
"sincronizzato". L'errore è scomparso. Ofcourse, non la soluzione migliore, ma cosa fare! processati in handleRequestInternal
per chiudere la sessione corrente e aprirne uno nuovo. Ma farebbe sì che altre parti dell'app non funzionassero correttamente. Ho provato a usare ThreadLocal
che non ha funzionato neanche.
se è possibile inserire il codice per il metodo che genera l'eccezione, lo esaminerò ulteriormente. Sembra una specie di pesce – walnutmon