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