加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 具有@Transactional注释的Spring OpenSessionInViewFilt

发布时间:2020-12-14 05:28:04 所属栏目:Java 来源:网络整理
导读:这是关于 Spring OpenSessionInViewFilter在服务层使用@Transactional注释. 我经历了这么多堆栈溢出帖子,但仍然困惑我是否应该使用OpenSessionInViewFilter或不避免LazyInitializationException 如果有人帮我找出以下查询的答案,这将是非常有帮助的. 在应用
这是关于 Spring OpenSessionInViewFilter在服务层使用@Transactional注释.

我经历了这么多堆栈溢出帖子,但仍然困惑我是否应该使用OpenSessionInViewFilter或不避免LazyInitializationException
如果有人帮我找出以下查询的答案,这将是非常有帮助的.

>在应用程序中使用OpenSessionInViewFilter是不好的做法
具有复杂的模式.
>使用此过滤器可能会导致N 1问题
>如果我们使用OpenSessionInViewFilter是否意味着@Transactional不是必需的?

下面是我的Spring配置文件

<context:component-scan base-package="com.test"/>
<context:annotation-config/>
 <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="resources/messages" />
        <property name="defaultEncoding" value="UTF-8" />
    </bean>
 <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        p:location="/WEB-INF/jdbc.properties" />
 <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
        p:driverClassName="${jdbc.driverClassName}"
        p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
        p:password="${jdbc.password}" />
       <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />     
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
        <property name="configurationClass">
            <value>org.hibernate.cfg.AnnotationConfiguration</value>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${jdbc.dialect}</prop>
                <prop key="hibernate.show_sql">true</prop>
                <!--
                <prop key="hibernate.hbm2ddl.auto">create</prop>
                 -->
            </props>
        </property>
    </bean>
 <tx:annotation-driven /> 
 <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />

  </bean>

解决方法

OpenSessionInView是一个servlet过滤器,而不仅仅是打开一个hibernate会话,并将其存储在为服务请求的线程的SessionHolder中.打开此会话后,当您在请求的呈现阶段使用这个时,hibernate可以读取Lazy初始化的集合和对象.调用SessionFactory.getCurrentSession()时,可以访问此会话.

但是,OpenSessionInView只是打开会话,它不会开始任何事务.打开一个会话后,您可以从数据库中读取对象,但是如果要在事务中执行某些操作,则需要使用@Transactional注释或其他机制来在事务的开始和结束时划分.

那么问题的答案是:

Is it bad practice to use OpenSessionInViewFilter in application having complex schema.

这是一个很好的做法,如果你需要避免LazyInitializationException,并且重载只是打开新的Hibernate Session,并在每个请求的请求结束时关闭它.

Using this filter can cause N+1 problem

我在许多项目中使用这个过滤器,没有任何问题.

if we are using OpenSessionInViewFilter does it mean @Transactional not required?

不,你只有一个Hibernate Session在SessionHolder中打开线程,但是如果你需要事务,你需要put @Transactional.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读