Вопрос

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

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

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

<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.x, не уверенное в 3.x, еще не выглядело) - использовать HibernatedAosupport в качестве базового класса для классов, если у вас будет доступ к сеансу. Но лично это выглядит немного хитрого для меня, потому что добавляет зависимость от специфических для пружины классы. Лучше - внедрить сеанс в свои бобы. Для этого вам нужно объявить свой сессионный фасоль с определением, похожим на это:

<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/hibernate-spring-in-standalone.html

Другие советы

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

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

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

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

Для тех, кто заинтересован: вот что я должен был добавить: весной 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top