Hibernate Interceptor和proxyTargetClass有什么用

时间:2011-09-07 07:08:13

标签: java hibernate spring

我是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"/>

1 个答案:

答案 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中如何做的事情: