Question

D'après ce que je l'ai lu jusqu'à présent j'avais entendu que l'utilisation des transactions serait la solution mise en veille prolongée à ses problèmes de chargement paresseux. La session sera disponible pendant toute la transaction dans la couche de service sans Adue.

Alors peut-être que je misconfigured ma gestion des transactions? Je suis en fait un NEWB quand il vient au printemps et en veille prolongée, mais les gars vous pourriez peut-être me aider.

Ma configuration:

<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" />

Ma mise en œuvre de DAO aurait simplement une annotation @Repository et un grain de Hibernate-template injecté à l'aide autowiring.

Un en-tête typique d'un service La mise en œuvre serait:

@Service
@Transactional(readOnly=true)
public class LeerlingServiceImpl implements LeerlingService {

    @Autowired
    LeerlingDAO leerlingDAO;
    @Autowired
    LeerplanDAO leerplanDAO;

Avec une annotation @Service(readOnly=false) si quelque chose est effectivement enregistrée / mise à jour dans cette méthode particulière.

Ai-je besoin de quelque chose d'autre configure pour vous assurer que je peux charger les bonnes associations dans mon service, ou est-ce normalement géré par des transactions?

En ce moment je suis un peu confus de ce que je dois faire en fait, merci de me aide:)

Était-ce utile?

La solution

problèmes et les transactions Lazy-chargement ne sont pas vraiment liés l'un à l'autre. Mais c'est une autre histoire :) Vous avez fait tout bien, à l'exception de l'accès à la session dans vos haricots. Pas sûr que vous allez le faire. La solution standard (2.x de printemps, pas sûr 3.x, ne sont pas encore regardé) est d'utiliser HibernateDaoSupport comme classe de base pour les classes étaient vous allez avoir un accès à la session. Mais personnellement, qui ressemble un peu louches pour moi, car ajoute la dépendance des classes spécifiques printemps. Une meilleure façon est d'injecter la session dans vos haricots. Pour ce faire, vous devez déclarer votre bean session avec une définition similaire à celle-ci:

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

et puis juste l'utiliser.

Voici les détails:

http: //stas-blogspot.blogspot. com / 2009/10 / mise en veille prolongée ressort en standalone.html

Autres conseils

Je pense que ma compréhension du printemps était mauvaise jusqu'à présent; il n'y avait en effet pas une véritable gestion de notre gestion de session. En fait ce qui est arrivé était maintenant. Vous pouvez obtenir des données de l'OFA, mais juste après vous l'avez reçu, vous pouvez même obtenir pas de collections paresseux chargé parce que la session a été fermée

Maintenant, nous utilisons l'intercepteur de mise en veille prolongée, qui attache la session au fil au début de chaque demande et ferme quand elle se termine. Ce n'est pas toujours la solution la plus idéale, mais pour un projet d'école, je ne dérange pas trop.

L'autre solution semble être: ajouter AOP d'une manière qui est utilisé @around que la session est disponible uniquement pendant un appel de méthode de service. Je pense que c'est la meilleure solution, mais, je ne vais pas creuser profondément que ce moment pour ce projet. La bonne chose est que je sais qu'il existe.

Cet article m'a beaucoup aidé: http://www.jroller.com/kbaum/ entrée / orm_lazy_initialization_with_dao

Pour les personnes intéressées: voici ce que je devais ajouter:. Dans Spring MVC 3.0, il est une nouvelle fonctionnalité appelée mvc:intereceptors qui m'a fait taper moins 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top