Весенние транзакции и гибернация: ленивая инициализация - PullRequest
0 голосов
/ 22 октября 2010

Из того, что я прочитал до сих пор, я понял, что использование транзакций будет решением проблем отложенной загрузки в hibernate. Сеанс будет доступен в течение всей транзакции на уровне обслуживания без дальнейшей обработки.

Так, может быть, я неправильно настроил управление транзакциями? Я на самом деле новичок, когда дело доходит до весны и зимней спячки, но, может быть, вы, ребята, могли бы мне помочь.

Моя конфигурация:

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

Моя реализация DAO будет просто иметь аннотацию @Repository и компонент Hibernate-template, внедренный с помощью автопроводки.

Типичным заголовком реализации сервиса будет:

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

    @Autowired
    LeerlingDAO leerlingDAO;
    @Autowired
    LeerplanDAO leerplanDAO;

С аннотацией @Service(readOnly=false), если что-либо действительно сохраняется / обновляется в этом конкретном методе.

Нужно ли настраивать что-то еще, чтобы убедиться, что я могу загружать нужные ассоциации в моем Сервисе, или это обычно обрабатывается транзакциями?

Прямо сейчас я немного озадачен тем, что я должен делать на самом деле, поэтому, пожалуйста, помогите мне:)

Ответы [ 2 ]

1 голос
/ 23 октября 2010

Я думаю, что мое понимание весны было просто плохим до сих пор; действительно не было никакого реального управления для нашего управления сессиями. По сути, теперь произошло следующее: вы могли получать данные из DAO, но сразу после того, как вы их получили, вы даже не могли загрузить ленивые коллекции, потому что сеанс был закрыт.

Теперь мы используем перехватчик hibernate, который присоединяет сеанс к потоку в начале каждого запроса и закрывает его, когда он заканчивается. Это не всегда самое идеальное решение, но для школьного проекта я бы не стал слишком беспокоиться.

Похоже, другое решение: добавить AOP таким образом, чтобы @around использовался, чтобы сеанс был доступен только во время вызова метода службы. Я думаю, что это лучшее решение, но я не собираюсь сейчас углубляться в этот проект. Хорошо, что я знаю, что он существует.

Эта статья также мне очень помогла: http://www.jroller.com/kbaum/entry/orm_lazy_initialization_with_dao

Для тех, кто заинтересован: вот что я должен был добавить: В Spring MVC 3.0 появилась новая функция под названием mvc:intereceptors, благодаря которой я печатал меньше 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>
1 голос
/ 22 октября 2010

Проблемы с отложенной загрузкой и транзакциями на самом деле не связаны друг с другом.Но это другая история :) Вы все сделали хорошо, кроме доступа к сеансу в ваших бобах.Не уверен, как вы собираетесь это сделать.Стандартное решение (весной 2.x, не уверенный в 3.x, еще не смотрел) заключается в использовании HibernateDaoSupport в качестве базового класса для классов, где вы собираетесь иметь доступ к сеансу.Но лично мне это кажется немного странным, потому что добавляет зависимость от классов, специфичных для Spring.Лучший способ - внедрить сессию в ваши бины.Для этого вам нужно объявить ваш сессионный компонент с определением, похожим на это:

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

, а затем просто использовать его.

Вот подробности:

http://stas -blogspot.blogspot.com / 2009/10 / гибернации-пружина в standalone.html

...