如何使用 Spring 和 Hibernate 5 注册实体事件监听器

2024-03-22

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

在 hibernate 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>

现在,我尝试在 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>

显示以下消息

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

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

休眠中的 PreInsert 和 PreUpdate 事件监听器 https://stackoverflow.com/questions/20368551/preinsert-and-preupdate-event-listener-in-hibernate

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

<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>

设置 Hibernate 实体侦听器的最便携方法是通过org.hibernate.integrator.spi.Integrator https://vladmihalcea.com/hibernate-event-listeners/。这样,您就可以让它同时工作JpaTransactionManager and 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) {
 
    }
}

Via the eventListenerRegistry,您可以注册事件监听器。

设置hibernate.integrator_provider配置属性

完成后,您需要设置hibernate.integrator_provider配置属性通过应用程序属性文件,像这样:

spring.jpa.properties.hibernate.integrator_provider=com.vladmihalcea.book.hpjp.hibernate.listener.ReplicationEventListenerIntegrator
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Spring 和 Hibernate 5 注册实体事件监听器 的相关文章

  • Java中如何合并两个数组?

    它不是连接而是合并两个数组 使它们成为名称值对的数组 firstarray a aa aaa secondarray b bb bbb result a b aa bb aaa bbb 最好的方法是什么 in Java public sta
  • 检测用户在 jQuery 中向下滚动或向上滚动[重复]

    这个问题在这里已经有答案了 可能的重复 jquery 中向上 向下滚动的区别 https stackoverflow com questions 4989632 differentiate between scroll up down in
  • 如何访问EmbeddedSolrServer实例的管理界面?

    在我的网络应用程序中 我正在运行org apache solr client solrj embedded EmbeddedSolrServer出于调试目的 我想访问管理界面 这就是我实例化服务器的方式 new EmbeddedSolrSe
  • 在 Spring Webflux 中执行阻塞 JDBC 调用

    我使用 Spring Webflux 和 Spring data jpa 使用 PostgreSql 作为后端数据库 我不想在进行数据库调用时阻塞主线程 例如find and save 为了实现同样的目标 我有一个主调度程序Controll
  • 如何对 jar 文件资源使用 File.separator?

    我正在尝试读取位于 jar 文件中的属性文件 我想使用 File separator 因为应用程序将在多个平台上运行 我正在构建路径如下 jarFilePath jar file jarFile getAbsolutePath jarPro
  • 使用 POJO 仅更新 JOOQ 记录中已更改的字段

    我想使用 POJO 作为源来更新 JOOQ 记录中已更改的字段 Record from Object http www jooq org javadoc 3 8 x org jooq Record html from java lang O
  • grails 中的 log4j:如何登录文件?

    我的 grails config groovy 中有这个 log4j 配置 log4j error org codehaus groovy grails web servlet controllers org codehaus groovy
  • 使用 Microsoft REST API - Java 将 Xbox-Live GamerTag 转换为 XUID

    我有一个 Java 应用程序 它需要能够获取用户输入的 Minecraft Bedrock Edition 玩家标签 并将其转换为给定帐户的 XUID 以便我可以将其存储起来以供稍后列入白名单和参考目的 我一直在浏览 Microsoft R
  • Spring 中的声明式或编程式事务

    在Spring中我们应该使用什么类型的事务管理策略 声明式还是程序式 哪一种更好 在什么情况下应该使用它 你能给出任何适当的例子或教程吗 还想知道在spring写数据库代码时最新应该使用什么东西 HibernateTemplate 的替代方
  • 检查更新时 Maven 无限期挂起

    我正在使用 Maven 构建一个项目 我是新手 并且它挂起 mvn package INFO Scanning for projects INFO INFO Building Presentation Reports INFO task s
  • SwingUtilities.invokeLater

    我的问题与SwingUtilities invokeLater 我应该什么时候使用它 每次需要更新 GUI 组件时都必须使用吗 它到底有什么作用 是否有替代方案 因为它听起来不直观并且添加了看似不必要的代码 Do I have to use
  • Java MYSQL/JDBC 查询从缓存的连接返回过时的数据

    我一直在 Stackoverflow 中寻找答案 但似乎找不到不涉及 Hibernate 或其他数据库包装器的答案 我直接通过 Tomcat 6 Java EE 应用程序中的 MYSQL 5 18 JDBC 驱动程序使用 JDBC 我正在缓
  • 如何根据从 jtextfield 和组合框接收的值将数据行添加到 Jtable

    我有一个JFrame表格有JTextFields JCombobox等等 我能够将这些值接收到变量 现在我想将接收到的数据添加到JTable当用户单击 添加 或类似的操作时在新行中 我创造了JTable使用 net beans 的问题是将这
  • 从侦听器中修改 JFrame [重复]

    这个问题在这里已经有答案了 可能的重复 如何在框架可见后调用 setUndecorated https stackoverflow com questions 875132 how to call setundecorated after
  • Tomcat下的Spring CXF Soap Web服务:找不到服务

    我正在尝试使用 CXF 和 Spring 设置一个在 Tomcat 上运行的简单 CXF Web 服务 我有一个 Web 应用程序初始化程序来引导 CXF servlet public class WebAppInitializer ext
  • 图标和导航视图之间的左边距

    我必须在图标和图标之间添加左边距NavigationView 如下图中箭头所示 我知道根据谷歌规范 这个边距必须有16dp但我需要改变它 我努力了
  • Unix 纪元时间转 Java Date 对象

    我有一个包含以下内容的字符串UNIX 纪元时间 https en wikipedia org wiki Unix time 我需要将其转换为 Java Date 对象 String date 1081157732 DateFormat df
  • Java 中的连接路径

    In Python我可以连接两条路径os path join os path join foo bar gt foo bar 我正在尝试在 Java 中实现相同的目标 而不用担心是否OS is Unix Solaris or Windows
  • 可空日期列合并问题

    我在 Geronimo 应用程序服务器上使用 JPA 和下面的 openjpa 实现 我也在使用MySQL数据库 我在更新具有可为空 Date 属性的对象时遇到问题 当我尝试合并 Date 属性设置为 null 的实体时 不会生成 sql
  • ImageIO.read(...) - 非常慢,有更好的方法吗?

    我正在加载大量将在我的应用程序中使用的图标 我计划在服务器启动时从 jar 中加载所有这些 然而 由于数百张图像加起来刚刚超过 9MB 执行此任务仍然需要 30 秒多的时间 我现在正在一个单独的线程中执行此操作 但这让我想知道我是否在代码中

随机推荐