我经历了这么多堆栈溢出帖子,但仍然困惑我是否应该使用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只是打开会话,它不会开始任何事务.打开一个会话后,您可以从数据库中读取对象,但是如果要在事务中执行某些操作,则需要使用@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 @R_502_103@?
不,你只有一个Hibernate Session在SessionHolder中打开线程,但是如果你需要事务,你需要put @Transactional.