春季交易& hibernate:懒惰的初始化

时间:2010-10-21 21:59:07

标签: java hibernate spring transactions lazy-initialization

从我到目前为止所读到的,我已经理解使用事务将是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 bean。

服务实现的典型标题是:

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

    @Autowired
    LeerlingDAO leerlingDAO;
    @Autowired
    LeerplanDAO leerplanDAO;

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

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

现在我对我应该做的事情感到有些困惑,所以请帮助我:)。

2 个答案:

答案 0 :(得分:1)

延迟加载问题和事务并不真正相互关联。但那是另一个故事:) 除了访问bean中的会话之外,你已经做得很好。不知道你将如何做到这一点。标准解决方案(在Spring 2.x中,不确定3.x,尚未查看)是使用HibernateDaoSupport作为类的基类,如果您将有权访问会话。但个人看起来有点狡猾,因为增加了对特定于Spring的类的依赖。更好的方法是将会话注入到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

答案 1 :(得分:1)

我认为我对春天的理解一直很糟糕;我们的会话管理确实没有真正的管理。基本上现在发生的事情是:你可以从DAO获取数据,但是在收到它之后你甚至无法加载延迟集合,因为会话已经关闭。

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

另一个解决方案似乎是:以@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>
相关问题