Questo significa che le mie entità sono memorizzate nella cache per impostazione predefinita?
JPA 1.0 non definisce una cache L2 ("cache condivisa"), JPA 1.0 definisce solo una cache L1 ("cache transazionale") ma i fornitori APP può supportare una cache oggetto condiviso, e più fare. Questo è il caso di TopLink Essentials che supporta la cache L1 e L2 tramite JPA Extensions for Caching (per JVM).
Ora, come spiegato nella grande articolo Understanding the cache of TopLink Essentials(GlassFish JPA):
- Tutte EntityManagers da medesime unità condivide la persistenza della cache di sessione (che è come TopLink chiama la cache di 2 ° livello).
- La cache di sessione è attivata per impostazione predefinita.
- Se sono presenti modifiche/eliminazioni di entità nel contesto di persistenza, esse vengono sincronizzate con la cache di sessione dopo una transazione impegnata, quindi lo stato della cache di sessione viene aggiornato (o tale cache non sarebbe utilizzabile affatto) .
Quindi ci deve essere qualcos'altro che non va nella configurazione. È possibile provare non disabilitare la cache di sessione condivisa a scopo di test (e solo a scopo di test) aggiungendo la seguente proprietà:
<property name="toplink.cache.shared.default" value="false"/>
ma sarei sorpreso se questo cambia nulla. Come ho detto, penso che ci sia un altro problema da qualche parte.
PS: Questo non risponde alla domanda ma, se si utilizza GlassFish v3, perché non si utilizza EclipseLink?
Aggiornamento: rispondere a un commento del PO
Quindi, se persisto record di dipendenti, allora è visto nel database, ma non nella collezione di dipendenti in reparto fino a quando ho esplicitamente inserirlo alla raccolta dei dipendenti. È questo passaggio necessario?
Beh, se non si crea il collegamento tra entità a livello di Java, JPA non sarà in grado di crearla al database (JPA solo fa quello che gli dice di fare). Quindi, sì, è necessario creare il collegamento e, in caso di un'associazione bidirezionale, è anche necessario impostare entrambi i lati del collegamento (ad esempio aggiungere employee
alla raccolta di dipendenti su Department
e impostare lo department
di un Employee
).
Ma non sto aggiornando il database al di fuori di JPA. Ho usato il metodo persist di jpa e il record è visto nel database. Ma quando recupero la lista, non vedo l'entità appena aggiunta. Mi aiuti per favore. – TCM
Inoltre, ancora più strano è il fatto che se cambio il provider da TopLink a EclipseLink, tutto funziona correttamente! Con TopLink solo questo problema sta arrivando. Sto usando Netbeans 6.8 e Glassfish v3. – TCM
@Nitesh stai usando le transazioni? Se sì, li stai commettendo? – cletus