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)
设置 Hibernate 实体侦听器的最便携方式是通过org.hibernate.integrator.spi.Integrator. 这样,您可以让它同时适用于JpaTransactionManager和HibernateTransactionManager。
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配置属性。
如果您使用的是persistence.xml配置文件,那么您可以像这样设置属性:
<property name="hibernate.integrator_provider"
value="com.vladmihalcea.book.hpjp.hibernate.listener.ReplicationEventListenerIntegrator"
/>
Run Code Online (Sandbox Code Playgroud)
或者,如果您使用 Spring Boot,您可以通过application.properties配置此属性,如下所示:
spring.jpa.properties.hibernate.integrator_provider=com.vladmihalcea.book.hpjp.hibernate.listener.ReplicationEventListenerIntegrator
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6855 次 |
| 最近记录: |