首页 文章

用Spring配置手动打开一个hibernate会话

提问于
浏览
0

我遇到的问题是我使用Spring来管理和加载我的Web应用程序的hibernate . 我目前正在使用OpenSessionInViewFilter . 这在我查看应用程序时按预期工作,但当我尝试从非视图相关活动(如Quartz任务或我创建的某些Runnable线程)访问hibernate以帮助完成某些任务时,这种方式不太好 . 这会导致Lazy初始化异常,并且不会发生会话可用异常 .

以下是我目前使用Spring管理Hibernate的方法

<bean id="mainDataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

    [..DB config..]
</bean>

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <property name="dataSource">
        <ref bean="mainDataSource"/>
    </property>
</bean>

<bean id="txManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <property name="sessionFactory"><ref local="sessionFactory"/></property>
    <property name="dataSource"><ref local="mainDataSource"/></property>
</bean>

然后我配置DAO对象,扩展HibernateDaoSupport并将它们注入服务类

<bean id="myDAO"
    class="package.myDAO">
    <property name="sessionFactory">
        <ref bean="sessionFactory" />
    </property>
</bean>

<bean id="mySvcTarget" class="package.myService">
    <property name="myDAO"><ref bean="myDAO"/></property>
</bean> 

<bean id="myService" 
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager">
        <ref bean="txManager"/>
    </property>

    <property name="target">
        <ref bean="mySvcTarget"/>
    </property>

    <property name="transactionAttributes">
        <props>
            <prop key="*">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean>

那么在我的应用程序中,myService被注入我的控制器类中,所以我用它来访问我的DAO . 对于我的情况虽然看起来我需要以其他方式访问我的DAO(或服务)并手动打开和关闭我的hibernate会话,因为我的服务类似乎只在视图会话期间打开 . 我不确定最好的方法 . Spring中已经存在所有的hibernate配置,所以我假设它只是一个问题或以某种方式调用它们 .

1 回答

  • 0

    首先,Spring应该可以看到您正在使用的那些附加服务(非视图) . 最简单的方法是使用@Service注释 . 要使其工作,您可以在配置中添加 <context:component-scan base-package="your.package"> .

    在此之后,如果Spring将您的服务视为bean,那么使用@Transactional注释就可以在其中使用Hibernate会话 .

相关问题