使用 Spring 和 Hibernate 5 注册事件侦听器

leo*_*lai 6 java events spring hibernate listener

现在,我想将我的应用程序从 Spring hibernate 3 升级到 5

在休眠 3 下,我创建了一个 POST-COMMIT-INSERT|UPDATE|DELETE 事件侦听器,如下所示

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="myDataSource" />
    <property name="annotatedClasses">
        <list>
            ....
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            ....
        </props>
    </property>
    <property name="eventListeners">
        <map>
            <entry key="post-commit-insert">
                <bean class="xxxx.AuditLogPostInsertEventListener" />
            </entry>
            <entry key="post-commit-update">
                <bean class="xxxx.AuditLogPostUpdateEventListener" />
            </entry>
            <entry key="post-commit-delete">
                <bean class="xxxx.AuditLogPostDeleteEventListener" />
            </entry>
        </map>
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

现在,我尝试在 Hibernate 5 下创建事件侦听器但没有成功

<bean id="mySessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource" />
    <property name="annotatedClasses">
        <list>
            ...
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            ...
        </props>
    </property>
    <property name="eventListeners">
        <map>
            <entry key="post-commit-insert">
                <bean class="xxxx.AuditLogPostInsertEventListener" />
            </entry>
            <entry key="post-commit-update">
                <bean class="xxxx.AuditLogPostUpdateEventListener" />
            </entry>
            <entry key="post-commit-delete">
                <bean class="xxxx.AuditLogPostDeleteEventListener" />
            </entry>
        </map>
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

显示了以下消息

bean 类 [org.springframework.orm.hibernate5.LocalSessionFactoryBean] 的无效属性“eventListeners”:Bean 属性“eventListeners”不可写或具有无效的 setter 方法。setter 的参数类型是否与 getter 的返回类型匹配?

我试图遵循这个 stackoverflow 但仍然没有成功。

休眠中的 PreInsert 和 PreUpdate 事件侦听器

我更改了如下配置,但仍然没有成功

<bean id="auditInterceptor" class="xxxx.EntityEventListenerRegistry" />

<bean id="mySessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource" />
    <property name="annotatedClasses">
        <list>
            ...
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            ...
        </props>
    </property>
    <property name="entityInterceptor" ref="xxxx.EntityEventListenerRegistry" />
</bean>
Run Code Online (Sandbox Code Playgroud)

Vla*_*cea 7

设置 Hibernate 实体侦听器的最便携方式是通过org.hibernate.integrator.spi.Integrator. 这样,您可以让它同时适用于JpaTransactionManagerHibernateTransactionManager

实现Integrator接口

您需要实现Integrator如下:

public class ReplicationEventListenerIntegrator 
        implements Integrator {
 
    public static final ReplicationEventListenerIntegrator INSTANCE = 
        new ReplicationEventListenerIntegrator();
 
    @Override
    public void integrate(
            Metadata metadata,
            SessionFactoryImplementor sessionFactory,
            SessionFactoryServiceRegistry serviceRegistry) {
 
        final EventListenerRegistry eventListenerRegistry =
                serviceRegistry.getService(EventListenerRegistry.class);
 
        eventListenerRegistry.appendListeners(
            EventType.POST_INSERT, 
            ReplicationInsertEventListener.INSTANCE
        );
         
        eventListenerRegistry.appendListeners(
            EventType.POST_UPDATE, 
            ReplicationUpdateEventListener.INSTANCE
        );
         
        eventListenerRegistry.appendListeners(
            EventType.PRE_DELETE, 
            ReplicationDeleteEventListener.INSTANCE
        );
    }
 
    @Override
    public void disintegrate(
            SessionFactoryImplementor sessionFactory,
            SessionFactoryServiceRegistry serviceRegistry) {
 
    }
}
Run Code Online (Sandbox Code Playgroud)

通过eventListenerRegistry,您可以注册事件侦听器。

设置hibernate.integrator_provider配置属性

完成后,您需要设置hibernate.integrator_provider配置属性。

  1. 如果您使用的是persistence.xml配置文件,那么您可以像这样设置属性:

     <property name="hibernate.integrator_provider"
               value="com.vladmihalcea.book.hpjp.hibernate.listener.ReplicationEventListenerIntegrator"
     />
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者,如果您使用 Spring Boot,您可以通过application.properties配置此属性,如下所示:

     spring.jpa.properties.hibernate.integrator_provider=com.vladmihalcea.book.hpjp.hibernate.listener.ReplicationEventListenerIntegrator
    
    Run Code Online (Sandbox Code Playgroud)


bun*_*udi 1

根据我的评论,拦截器需要实现org.hibernate.Interceptor