gpt4 book ai didi

java - 带有 @Transactional 注释的 Spring OpenSessionInViewFilter

转载 作者:IT老高 更新时间:2023-10-28 13:46:05 24 4
gpt4 key购买 nike

这是关于 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 session 并将其存储在 SessionHolder 中,用于为请求提供服务的线程。打开此 session 后,当您在请求的渲染阶段使用它时,hibernate 可以读取延迟初始化的集合和对象。当您调用 SessionFactory.getCurrentSession() 时可以访问此 session 。

但是,OpenSessionInView 只是打开 session ,并没有开始任何事务。打开 session 后,您可以从数据库中读取对象,但是,如果您想在事务中执行某些操作,则需要 @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?

没有。你只在线程的 SessionHolder 中打开了一个 Hibernate Session,但是如果你需要 Transactions 你需要放 @Transactional

关于java - 带有 @Transactional 注释的 Spring OpenSessionInViewFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23877900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com