繁体   English   中英

春季交易和休眠:延迟初始化

[英]Spring transactions & hibernate: lazy initialization

从到目前为止的阅读中,我了解到使用事务将是休眠休眠加载问题的解决方案。 该会话将在服务层的整个事务过程中可用,而没有其他建议。

因此,也许我没有正确配置事务管理? 在春季和冬季,我实际上是一个新手,但是也许你们可以帮我一下。

我的配置:

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

服务实现的典型标头为:

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

    @Autowired
    LeerlingDAO leerlingDAO;
    @Autowired
    LeerplanDAO leerplanDAO;

如果在该特定方法中实际保存/更新了任何内容,则使用@Service(readOnly=false)批注。

我是否需要配置其他内容以确保可以在我的服务中加载正确的关联,还是通常由事务处理?

现在,我对应该实际执行的操作感到有些困惑,所以请帮助我:)

延迟加载问题和事务之间并没有真正的关联。 但这是另一个故事:)除了可以访问bean中的会话之外,您还做得很好。 不确定您将如何执行此操作。 标准解决方案(在Spring 2.x中,尚不确定3.x,尚未使用)是将HibernateDaoSupport用作要访问会话的类的基类。 但是就我个人而言,这对我来说似乎有点狡猾,因为增加了对特定于Spring的类的依赖。 更好的方法是将会话注入到bean中。 为此,您需要声明您的会话bean,其定义类似于该bean:

<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

我认为到目前为止我对Spring的了解还很糟糕。 实际上,我们的会话管理没有真正的管理。 基本上现在发生的是:您可以从DAO中获取数据,但是在收到数据之后,由于会话已关闭,您甚至无法加载惰性集合。

现在我们使用休眠拦截器,它在每个请求的开始将会话附加到线程,并在结束时将其关闭。 这并不总是最理想的解决方案,但是对于一个学校项目,我不会太在意。

另一个解决方案似乎是:以@around的方式添加AOP,以使会话仅在服务方法调用期间可用。 我认为这是最好的解决方案,但是,对于该项目,我现在不会对此进行深入探讨。 好消息是我知道它的存在。

这篇文章对我也有很大帮助: 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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM