Iniettando le sessioni di prototipo significa che ognuno dei tuoi oggetti DAO, per definizione, otterrà la propria sessione ... D'altra parte SessionFactory
ti dà il potere di open e condividi sessioni a volontà.
Infatti getCurrentSession non si apre una nuova sessione su ogni chiamata ... Invece, si riutilizzerà sessioni binded alla current session context (ad esempio, Filo, JTA Transacion o contesto Esternamente gestito).
Quindi pensiamoci; Supponiamo che nel tuo livello aziendale ci sia un'operazione che ha bisogno di leggere e aggiornare diverse tabelle di database (che significa interagire, direttamente o indirettamente, con diversi DAO) ... Scenario abbastanza comune giusto? Di solito, quando questo tipo di operazione fallisce, vorrai eseguire il rollback di tutto ciò che è successo nell'operazione corrente, giusto? Quindi, per questo caso "particolare", quale tipo di strategia sembra appropriata?
- Spanning diverse sessioni, ognuna delle quali gestisce il proprio tipo di oggetti e legato a diverse transazioni.
- Avere una singola sessione di gestione degli oggetti relativi a questa operazione ... Delimitare le transazioni in base alle esigenze aziendali.
In breve, condividere le sessioni e delimitare le transazioni in modo efficace non solo migliorerà le prestazioni delle applicazioni, è parte della funzionalità dell'applicazione.
sarei profondamente consiglio di leggere Chapter 2 e Chapter 13 del Hibernate Core Reference Manual per comprendere meglio i ruoli che SessionFactory
, Session
e Transaction
giochi nel quadro. Insegnerà inoltre circa le Unità di lavoro così come i popolari modelli di sessione e anti-pattern.
fonte
2013-05-31 04:50:13
Un caso ha letto [il documento] (http://docs.jboss.org/hibernate/orm/3.5/javadoc/org/hibernate/Session.html) che dice 'Se la Sessione genera un'eccezione, la transazione deve essere ritirato e la sessione scartata. Lo stato interno della sessione potrebbe non essere coerente con il database dopo che si è verificata l'eccezione. –
È meglio iniettare 'javax.persistence.EntityManager', ma per questo, è necessario insistere sull'uso di JPA. – Lion