我是hibernate和spring的新手,并试图学习使用hibernate Interceptor。 我浏览了社区文档,其中说....
这个拦截器将一个新的Hibernate Session绑定到一个线程之前 方法调用,关闭并在任何方法的情况下删除它 结果。如果已经有预先绑定的会话(例如来自 HibernateTransactionManager,或来自周围 Hibernate-intercepted方法),拦截器只是参与其中 它
但是我无法理解我们何时使用它以及为什么要使用它?
何时创建这样的taskDao?
<bean name="abstractDao" abstract="true">
<property name="hibernateTemplate" ref="taskHibernateTemplate"/>
</bean>
<bean id="taskHibernateInterceptor" class="org.springframework.orm.hibernate3.HibernateInterceptor">
<property name="sessionFactory" ref="taskSessionFactory"/>
</bean>
<bean id="taskDaoTarget" class="com.xyz.abc.backgroundtask.impl.TaskDao" parent="abstractDao"/>
<bean id="taskDao" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyTargetClass" value="true"/>
<property name="interceptorNames">
<list>
<value>taskHibernateInterceptor</value>
<value>taskDaoTarget</value>
</list>
</property>
</bean>
何时创建这样的taskDao?
<bean name="abstractDao" abstract="true">
<property name="hibernateTemplate" ref="taskHibernateTemplate"/>
</bean>
<bean id="taskDao" class="com.xyz.zbc.backgroundtask.impl.TaskDao" parent="abstractDao"/>
答案 0 :(得分:3)
你必须使用Hibernate Interceptor吗?因为我建议你改用Spring(基于注释)Declarative Transaction Management。它是许多支持的底层技术的通用抽象。
基本上,你所做的是定义一个TransactionManager Bean,在Hibernate的情况下使用JPA:
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="myEmf"/>
</bean>
没有JPA:
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
在这两种情况下,都要激活基于注释的交易:
<tx:annotation-driven />
或者,如果您不使用接口:
<tx:annotation-driven proxy-target-class="true" />
现在使用@Transactional
注释您的服务层方法或类,您将自动获得在服务方法范围内创建的会话。
我建议你不要使用HibernateInterceptor和HibernateTemplate,它们都不是现代的做事方式。
<强>读:强>
看看以前在Spring中如何做的事情: