【问题标题】:How do I use a Hibernate entity-interceptor with JPA transaction manager?如何将 Hibernate 实体拦截器与 JPA 事务管理器一起使用?
【发布时间】:2014-09-25 19:03:32
【问题描述】:

我正在从 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 的事务管理器?

【问题讨论】:

  • @Amogh 是的。我的解决方案是完全放弃休眠拦截器并将其转换为 JPA 侦听器。这样也干净一点。

标签: java spring hibernate jpa


【解决方案1】:

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

  • hibernate.ejb.interceptor : 这个拦截器将被所有 Session 共享,使这个拦截器 SessionFactory 范围受限。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-19
        • 1970-01-01
        • 1970-01-01
        • 2014-09-06
        • 1970-01-01
        相关资源
        最近更新 更多