gpt4 book ai didi

hibernate - 如何在 Spring Boot 中使用 Spring 管理的 Hibernate 拦截器?

转载 作者:行者123 更新时间:2023-12-03 08:44:16 24 4
gpt4 key购买 nike

是否可以在 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 拦截器。

最佳答案

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

spring.jpa.properties.hibernate.ejb.interceptor=my.package.MyInterceptorClassName
如果您需要拦截器也是一个 bean,您可以创建自己的 LocalContainerEntityManagerFactoryBean . EntityManagerFactoryBuilder从 Spring Boot 1.1.4 开始对属性的通用性有点过于严格,因此您需要强制转换为 (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;
}
};
}

关于hibernate - 如何在 Spring Boot 中使用 Spring 管理的 Hibernate 拦截器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25283767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com