Java Hibernate拦截器和proxyTargetClass的用途是什么

Java Hibernate拦截器和proxyTargetClass的用途是什么,java,hibernate,spring,Java,Hibernate,Spring,我是hibernate和spring的新手,正在尝试学习hibernate拦截器的使用。 我查阅了社区文档,上面说 此拦截器将新的Hibernate会话绑定到 方法调用,如果是任何方法,则关闭并随后移除它 结果。如果已经有一个预先绑定的会话(例如从 HibernateTransactionManager,或来自周围环境 Hibernate拦截方法),拦截器只参与 它 但我不明白我们什么时候用这个,为什么用这个 什么时候创建这样的taskDao <bean name="abstractDao

我是hibernate和spring的新手,正在尝试学习hibernate拦截器的使用。 我查阅了社区文档,上面说

此拦截器将新的Hibernate会话绑定到 方法调用,如果是任何方法,则关闭并随后移除它 结果。如果已经有一个预先绑定的会话(例如从 HibernateTransactionManager,或来自周围环境 Hibernate拦截方法),拦截器只参与 它

但我不明白我们什么时候用这个,为什么用这个

什么时候创建这样的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>
<bean name="abstractDao" abstract="true">
        <property name="hibernateTemplate" ref="taskHibernateTemplate"/>
    </bean>

<bean id="taskDao" class="com.xyz.zbc.backgroundtask.impl.TaskDao" parent="abstractDao"/>

任务HibernateInterceptor
taskDaoTarget
什么时候创建这样的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>
<bean name="abstractDao" abstract="true">
        <property name="hibernateTemplate" ref="taskHibernateTemplate"/>
    </bean>

<bean id="taskDao" class="com.xyz.zbc.backgroundtask.impl.TaskDao" parent="abstractDao"/>

您必须使用Hibernate拦截器吗?因为我建议您使用Spring的(基于注释的)。它是许多受支持的底层技术的通用抽象

基本上,您要做的是定义TransactionManager Bean,在使用JPA的Hibernate的情况下:

<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,它们都不再是现代的做事方式

阅读:

  • 或者,如果您使用JPA:
看看春天人们是怎么做的:


您必须使用Hibernate拦截器吗?因为我建议您使用Spring的(基于注释的)。它是许多受支持的底层技术的通用抽象

基本上,您要做的是定义TransactionManager Bean,在使用JPA的Hibernate的情况下:

<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,它们都不再是现代的做事方式

阅读:

  • 或者,如果您使用JPA:
看看春天人们是怎么做的: