当前位置: 首页 > 知识库问答 >
问题:

如何在Spring Boot中使用Spring托管Hibernate拦截器?

南门茂才
2023-03-14

是否可以在Spring Boot中集成Spring托管Hibernate拦截器(http://docs.jboss.org/Hibernate/orm/4.3/manual/en-us/html/ch14.html)?

我正在使用Spring Data JPA和Spring Data REST并需要一个Hibernate拦截器来处理实体上特定字段的更新。

对于标准的JPA事件,不可能获得旧值,因此我认为我需要使用Hibernate拦截器。

共有1个答案

师冥夜
2023-03-14

没有特别简单的方法来添加一个同时也是Spring Bean的Hibernate拦截器,但是如果它完全由Hibernate管理,您可以很容易地添加一个拦截器。为此,请将以下内容添加到application.properties:

spring.jpa.properties.hibernate.ejb.interceptor=my.package.MyInterceptorClassName

如果您需要拦截器也是bean,那么您可以创建自己的LocalContainerEntityManagerFactoryBean。Spring Boot 1.1.4中的EntityManagerFactoryBuilder对属性的泛型限制过大,因此需要强制转换为(Map),我们将研究在1.2中解决这一问题。

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
        EntityManagerFactoryBuilder factory, DataSource dataSource,
        JpaProperties properties) {
    Map<String, Object> jpaProperties = new HashMap<String, Object>();
    jpaProperties.putAll(properties.getHibernateProperties(dataSource));
    jpaProperties.put("hibernate.ejb.interceptor", hibernateInterceptor());
    return factory.dataSource(dataSource).packages("sample.data.jpa")
            .properties((Map) jpaProperties).build();
}

@Bean
public EmptyInterceptor hibernateInterceptor() {
    return new EmptyInterceptor() {
        @Override
        public boolean onLoad(Object entity, Serializable id, Object[] state,
                String[] propertyNames, Type[] types) {
            System.out.println("Loaded " + id);
            return false;
        }
    };
}
 类似资料:
  • 我使用Spring Boot v2.0.3和Hibernate 5.2。我想创建一个Hibernate拦截器,在我的一个实体字段中生成一个值,基于我数据库中的一个唯一数字,然后保存。 我获取了一些在线资源,并最终扩展了Hibernate空拦截器,以覆盖onSave方法。 在我的申请中。yml配置文件,我添加了以下键: 当我尝试保存票证时,我可以看到方法onSave被正确调用,但是由于拦截器完全由H

  • 问题内容: 我看到 一吨 的条目在我的Tomcat日志(样品粘贴下面)。这些在几个月前进行次要版本升级(Spring Security 4.2.4,IIRC)后开始出现在我的日志文件中,因此,这显然是默认情况下启用的Spring新安全功能。这里报告了类似的问题,但是我的问题专门涉及如何在控制器中拦截这些异常。有一个针对此问题的Spring Security错误记录(提供一种处理RequestRej

  • 我在Tomcat日志中看到大量条目(示例粘贴在下面)。在几个月前的一次小版本升级(Spring Security 4.2.4,IIRC)后,这些功能开始出现在我的日志文件中,因此这显然是Spring中默认启用的一个新的安全特性。这里报告了一个类似的问题,但我的问题具体涉及如何在控制器中拦截这些异常。这个问题有一个Spring Securitybug(提供一种处理RequestRejectedExc

  • 我正在尝试使用<code>网络客户端 谢谢 -斯里尼

  • 问题内容: 如何在Hibernate拦截器中获取Hibernate会话? 我正在尝试使用Hibernate通过组织ID透明地强制执行数据访问。我设置了一个全局筛选器,以按组织ID筛选所有查询。现在,在保存/更新之前,我需要使用实体拦截器在所有实体上设置组织ID。 组织ID来自HttpSession 我已经在Hibernate会话中将Organizational Id设置为Filter属性,我想在我

  • 是否可以在数据库连接或数据源的底层放置一个钩子,并在执行任何其他查询之前执行一个查询? 你好。 我希望能够在Hibernate状态下拦截所有数据库查询,并在原始查询发送到数据库之前注入执行一个简单的查询:。 由于hibernate对其管理的实体使用生命周期,所以我发现实现我所需要的是一个挑战。 在我的Spring启动应用程序中,我想使用触发器审核数据更改。我希望能够将更改与Spring应用程序中当