您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

带有@Transactional批注的Spring OpenSessionInViewFilter

带有@Transactional批注的Spring OpenSessionInViewFilter

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

但是,OpenSessionInView只会打开会话,并且不会开始任何事务。在打开会话的情况下,您可以从数据库中读取对象,但是,如果要在事务中执行某些操作,则需要@Transactional注释或其他机制来在需要时划定事务的开始和结束位置。

然后是问题的答案:

在具有复杂模式的应用程序中使用OpenSessionInViewFilter是不好的做法。

如果您需要避免LazyInitializationException并且重载只是打开新的Hibernate Session并在每个请求的请求结束时将其关闭,则这是一个好习惯。

使用此滤镜可能会导致N + 1问题

我在许多项目中都使用了此过滤器,并且不会引起任何问题。

如果我们使用的是OpenSessionInViewFilter,是否意味着不需要@Transactional?

不会。您只能在线程的SessionHolder中打开一个Hibernate Session,但是如果需要Transaction,则需要put@Transactional

Java 2022/1/1 18:14:03 有510人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶