transazioni Spring & hibernate: l'inizializzazione differita
-
10-10-2019 - |
Domanda
Da quello che ho letto finora ho avuto la consapevolezza che utilizzando le transazioni sarebbe la soluzione per il letargo dei problemi di caricamento pigro. La sessione sarà disponibile durante l'intera transazione nel livello di servizio senza ulteriori Adue.
Quindi forse ho configurato correttamente la mia gestione delle transazioni? In realtà sono un newb quando si tratta di primavera e Hibernate, ma forse voi ragazzi mi potrebbe aiutare.
La mia configurazione:
<bean class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
id="sessionFactory">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- Hibernate Template bean that will be assigned to DAOs. -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<!--
Transaction manager for a single Hibernate SessionFactory (alternative
to JTA)
-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
La mia applicazione DAO avrebbe semplicemente un'annotazione @Repository
e un fagiolo Hibernate-template
iniettato usando autowiring.
Una tipica intestazione di un'implementazione del servizio potrebbe essere:
@Service
@Transactional(readOnly=true)
public class LeerlingServiceImpl implements LeerlingService {
@Autowired
LeerlingDAO leerlingDAO;
@Autowired
LeerplanDAO leerplanDAO;
Con un'annotazione @Service(readOnly=false)
se qualcosa è effettivamente salvato / aggiornato in quel particolare metodo.
Ho bisogno di configurare qualcos'altro per fare in modo che posso caricare le associazioni proprio nel mio servizio, o si tratta di solito gestito da transazioni?
In questo momento io sono solo un po 'confuso di quello che dovrebbe effettivamente fare, quindi per favore help me:)
Soluzione
problemi Lazy-caricamento e le transazioni non sono realmente legate le une alle altre. Ma questa è un'altra storia :) Hai fatto tutto bene, a parte l'accesso alla sessione nelle fagioli. Non sicuro di come si sta andando a fare questo. La soluzione standard (in 2.x primavera, non è sicuro su 3.x, non hanno ancora guardato) è quello di utilizzare HibernateDaoSupport come classe base per le classi erano che si sta per avere un accesso alla sessione. Ma personalmente che sembra un po 'rischiosa per me, perché aggiunge dipendenza classi primavera-specifici. Modo migliore è quello di iniettare sessione nei vostri fagioli. Per fare questo è necessario dichiarare la vostra session bean con la definizione simile a quello:
<bean name="hibernateSession" class="org.springframework.orm.hibernate3.SessionFactoryUtils" factory-method="getSession"
scope="prototype">
<constructor-arg index="0" ref="hibernateSessionFactory"/>
<constructor-arg index="1" value="false"/>
<aop:scoped-proxy/>
</bean>
e poi basta usarlo.
Ecco i dettagli:
http: //stas-blogspot.blogspot. com / 2009/10 / hibernate-spring-in-standalone.html
Altri suggerimenti
Credo che la mia comprensione della primavera era proprio male fino ad ora; non vi era in effetti una vera gestione per la nostra gestione della sessione. Fondamentalmente quello che oggi è successo è stato:. Si potrebbe ottenere i dati dal DAO, ma subito dopo averlo ricevuto non si poteva nemmeno ottenere collezioni pigri caricato perché la sessione è stata chiusa
Ora stiamo utilizzando l'intercettore di ibernazione, che attribuisce la sessione al filo all'inizio di ogni richiesta e si chiude quando finisce. Questo non è sempre la soluzione più ideale, ma per un progetto scolastico non mi preoccuperei troppo.
L'altra soluzione sembra essere: aggiungi AOP in un modo che @around
viene utilizzato che la sessione è disponibile solo durante una chiamata metodo di servizio. Penso che questa sia la soluzione migliore, però, non ho intenzione di scavare in profondità che in questo momento per questo progetto. La cosa buona è che so che esiste.
In questo articolo mi ha aiutato molto: http://www.jroller.com/kbaum/ ingresso / orm_lazy_initialization_with_dao
Per chi fosse interessato: ecco quello che ho dovuto aggiungere:. In Spring MVC 3.0 v'è una nuova funzionalità denominata mvc:intereceptors
che mi ha fatto tipo meno xml
<!-- WEB-INF/applicationContext.xml or your own XML config file -->
<mvc:interceptors>
<bean
class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
</mvc:interceptors>