transactionmanager原理(OpenSessionInViewFilter原理以及为什么要用OpenSessionInViewF)
本文目录
OpenSessionInViewFilter原理以及为什么要用OpenSessionInViewF
首先要说明一下Open Session in View的作用,就是允许在每次的整个request的过程中使用同一个hibernate session,可以在这个request任
何时期lazy loading数据。
如果是singleSession=false的话,就不会在每次的整个request的过程中使用同一个hibernate session,而是每个数据访问都会产生各自的seesion,等于没有Open Session in View.
OpenSessionInViewFilter默认是不会对session 进行flush的,并且flush mode 是 never
代码:
protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
session.setFlushMode(FlushMode.NEVER);
return session;
}
看getSession的方式就知道,把flush mode 设为FlushMode.NEVER,这样就算是commit的时候也不会session flush,
如果想在完成request过程中更新数据的话, 那就需要先把flush model设为FlushMode.AUTO,再在更新完数据后flush.
.
OpenSessionInView默认的FlushMode为
代码:
FlushMode.NEVER
::::::::::解决方法::::::::::::
可以采用spring的事务声明解决,示例代码如下:
《!-- 声明一个 Hibernate 3 的 事务管理器供代理类自动管理事务用--》
《bean id=“transactionManager“
class=“org.springframework.orm.hibernate3.HibernateTransactionManager“》
《property name=“sessionFactory“ ref=“sessionFactory“/》
《/bean》
《aop:config》
《!-- 切入点指明了在执行com.ssh3.manager包中的所有方法时产生事务拦截操作 --》
《aop:pointcut id=“daoMethods“ expression=“execution(* com.ssh3.manager.*.*(..))“/》
《!-- 定义了将采用何种拦截操作,这里引用到 txAdvice --》
《aop:advisor advice-ref=“txAdvice“ pointcut-ref=“daoMethods“/》
《/aop:config》 ;
《!-- 事务通知操作,使用的事务管理器引用自transactionManager --》
《tx:advice id=“txAdvice“ transaction-manager=“transactionManager“》
《tx:attributes》
《!-- 指定哪些方法需要加入事务 --》
《tx:method name=“getPageTable*“ propagation=“REQUIRED“/》
《tx:method name=“getTotalRecodes“ propagation=“REQUIRED“/》
《tx:method name=“save*“ propagation=“REQUIRED“/》
《tx:method name=“delete*“ propagation=“REQUIRED“/》
《tx:method name=“update*“ propagation=“REQUIRED“/》
《/tx:attributes》
《/tx:advice》
使用Spring AOP代理方式实现声明式事务的原理
首先将sessionFactory注入到HibernateTransactionManager中,再将HibernateTransactionManager对象注入到TransactionProxyFactoryBean对象中~应该还有一段对sessionFactory的定义
AOP就是面向代理的模式,本来一个应用程序要对某个对象进行操作的,但是这个对象中包含了很多与他本身不相关的业务逻辑,不如日志、锁等等。所以就要想办法把这些无关的东西全部抽离出来。被抽离过的对象就是被代理对象。
此时应用程序再调用的时候,会去调用代理对象,这个对象中包含了对被代理对象的调用以及被抽离出来的无关的业务逻辑方法。被代理对象则是纯粹的业务逻辑。
至于触发的话因为在容器起来的时候,比如tomcat或者jboss,会定义到指定的xml文件然后这些谁注入到谁的东西会被自动识别的。
更多文章:
锈湖系列天堂岛paradise第四灾寄居蟹攻略?锈湖系列天堂岛paradise第九灾星盘解密攻略
2024年5月11日 09:03
怪物猎人2g ios(iOS版怪物猎人2G怎么保存和退出游戏)
2024年7月3日 07:14
ipad价钱(苹果发布2022款iPad Pro:国行全面涨价,值得购买吗)
2024年2月3日 19:00
电动车一线通和显示电量有关系吗?电动车仪表霍尔/一线通怎么接
2024年7月23日 21:37