Domanda

So che questa è una domanda soggettiva, ma perché Hibernate sembra progettato per sessioni di breve durata? Generalmente nelle mie app creo DAO per astrarre il mio livello dati, ma dal momento che non riesco a prevedere come verranno utilizzati gli oggetti entità alcune delle sue raccolte sono caricate in modo lento, o dovrei dire che non si carica una volta chiusa la sessione.

Perché non l'hanno progettato in modo che riaprisse automaticamente la sessione o che le sessioni rimanessero sempre aperte?

È stato utile?

Soluzione

Poiché una volta usciti dal limite della transazione, non è possibile accedere nuovamente al database senza avviare una nuova transazione. Avere transazioni a lungo termine "per ogni evenienza" è una cosa negativa (tm).

Suppongo che desideri caricare lentamente l'oggetto dalla tua vista: dai un'occhiata a qui per alcune opzioni. Preferisco definire esattamente quanto della mappa degli oggetti verrà restituita dai metodi della facciata della mia sessione. Trovo che questo semplifichi il test unitario e il test delle prestazioni del livello aziendale.

Altri suggerimenti

Ho lavorato su un'app desktop che utilizzava EJB e Hibernate. Abbiamo dovuto impostare lazy = false ovunque, perché quando gli oggetti vengono serializzati, perdono la capacità di essere recuperati dal backend. Purtroppo è così che va.

Se ti preoccupi delle prestazioni, potresti usare la cache sul backend in modo che i tuoi recuperi non pigri non siano così dolorosi.

Stai cercando il modello OpenSessionInView, che è essenzialmente un filtro concettuale (e talvolta implementato come filtro servlet) che rileva quando una sessione deve essere riaperta in modo trasparente. Diversi framework implementano questo in modo che lo gestisca automaticamente.

Sto scrivendo un'applicazione desktop, quindi l'utilizzo di un filtro non è applicabile.

Le connessioni sono una risorsa scarsa che deve essere riciclata non appena hai finito di usarle. Se si utilizza anche il pool di connessioni, ottenerne un altro quando è necessario dovrebbe essere rapido. Questa è l'architettura che devi usare per ridimensionare i siti Web - anche se sei un'app desktop, i loro casi d'uso probabilmente si concentrano su siti scalabili.

Se guardi MS ADO.NET, vedrai un'attenzione simile a mantenere le connessioni aperte per un breve periodo: hanno un intero modello offline per l'aggiornamento dei dati disconnessi e quindi l'applicazione a un database quando sei pronto.

Hibernate è progettato come un modo per mappare gli oggetti alle tabelle del database relazionale. Compie quel lavoro molto bene. Ma non può sempre piacere a tutti. Penso che ci sia una certa complessità nell'apprendere come funziona l'inizializzazione, ma una volta che hai capito bene ha senso. Non so se sia stato necessariamente "progettato" specificamente per farti arrabbiare, è solo il modo in cui è successo.

Se riaprisse magicamente le sessioni in non-webapp, penso che la complessità dell'apprendimento del framework supererebbe di gran lunga i benefici.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top