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:)

È stato utile?

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top