如何在JPA事务管理器中使用Hibernate实体拦截器?

时间:2014-08-02 21:16:35

标签: java spring hibernate jpa

我正在从Spring应用程序转换基于XML的配置。这是配置的一部分在XML中的样子:

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL82Dialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.use_sql_comments">true</prop>
            <prop key="hibernate.format_sql">true</prop>
            <!--<prop key="hibernate.hbm2ddl.auto">create-drop</prop> -->
        </props>
    </property>
    <property name="packagesToScan" value="net.vivin" />
</bean>

<bean id="timeStampedEntityInterceptor" class="net.vivin.myapp.hibernate.interceptor.TimeStampedEntityInterceptor" />

<bean id="transactionManager"
      class="org.springframework.orm.hibernate4.HibernateTransactionManager"
      p:sessionFactory-ref="sessionFactory"
      p:entityInterceptor-ref="timeStampedEntityInterceptor">
</bean>

在查看this answer之后,我可以看到最佳做法是使用JPA事务管理器而不是Hibernate的事务管理器。

我无法弄清楚如何在JPA事务管理器上设置实体拦截器。有谁知道如何做到这一点?基于XML的配置也很好,因为我可以将它转换为Java。在我的Java配置中,对于事务管理器,我只有:

@Bean
public PlatformTransactionManager getTransactionManager(EntityManagerFactory entityManagerFactory) {
    JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
    jpaTransactionManager.setEntityManagerFactory(entityManagerFactory);
    return jpaTransactionManager;
}

但是,JpaTransactionManager没有设置拦截器的方法。有谁知道如何做到这一点?或者我只需要使用Hibernate的事务管理器吗?

3 个答案:

答案 0 :(得分:2)

事实证明,我完全错了。解决方案是不要尝试在我的代码中使用Hibernate实体拦截器。我选择使用JPA侦听器,并在我的实体上使用@EntityListeners注释。这基本上具有与拦截器相同的功能。

答案 1 :(得分:1)

您可以使用以下Hibernate properties中的一个(在persistence.xml中或将它们提供给JPATransactionManager):

  • hibernate.ejb.interceptor:此拦截器将由所有Sessions共享,使此拦截器SessionFactory范围受限。

  • hibernate.ejb.interceptor.session_scoped:将为每个Session提供一个新实例,使这个拦截器会话范围受到限制。

答案 2 :(得分:0)

您可以在LocalSessionFactoryBean定义中添加EntityInterceptor。 LocalSessionFactoryBean是特定于Hibernate的。