gpt4 book ai didi

spring - 使用 Spring Boot 和 Spring Data JPA 的 Hibernate 拦截器或监听器

转载 作者:行者123 更新时间:2023-12-04 12:26:38 68 4
gpt4 key购买 nike

我想在保存对象的子集(级联=全部)之前运行一些检查。

我正在使用 Spring Boot 和 Spring Data JPA,并且想知道哪种方法最好:Hibernate 监听器或拦截器。每个的优点/缺点是什么?你碰巧有一个你认为最好的方法的例子吗?

我在 XML 中配置之前使用过 Hibernate 监听器,如下所示:

    <property name="eventListeners">
<map>
<entry key="post-update">
<list>
<ref bean="myListener" />
</list>
</entry>
</map>
</property>

在 session 工厂(旧项目)上。但是现在我的大部分配置都在注释中(因为 Spring Boot),我想让配置尽可能简单和轻便,所以拦截器可能是一个更好的解决方案。

谢谢你。

最佳答案

我为自己做了很多环顾四周,并认为我会分享我的工作(我在底部包含了有用的(非内联)链接)。

拦截器

要使用拦截器,请扩展 org.hibernate.EmptyInterceptor 类并覆盖您要拦截的方法。
你可能想要 onSave(...) 在你的情况下。

package foo.bar;

import org.hibernate.EmptyInterceptor;
import org.hibernate.type.Type;
import java.io.Serializable;

public class MyInterceptor extends EmptyInterceptor {
@Override
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
// do your checks here
return false;
}
}

您必须 register your interceptor使用 Spring/Hibernate。
您可以在 application.properties or application.yml 中执行此操作.
spring:
jpa:
properties:
hibernate.ejb.interceptor: foo.bar.MyInterceptor

拦截器的优点是它(可能)更少的代码和相对简单的配置。
缺点是您的整个应用程序只能使用一个,并且使用该 API 可能会令人困惑。

事件监听器

对于事件,您实现 Hibernate 的 org.hibernate.event.spi.*Listener 之一接口(interface)。
您可能想要 org.hibernate.event.spi.PreInsertEventListener 在你的情况下。

您必须在 EventListenerRegistry 中注册您的事件.
为此,您可以将您的类(class)设为 @Component , @Autowire EntityManagerFactory进入你的类(class),并创建一个 @PostConstruct方法来注册你的类(class)。
package foo.bar;

import org.hibernate.event.service.spi.EventListenerRegistry;
import org.hibernate.event.spi.EventType;
import org.hibernate.event.spi.PreInsertEvent;
import org.hibernate.event.spi.PreInsertEventListener;
import org.hibernate.internal.SessionFactoryImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.persistence.EntityManagerFactory;

@Component
public class MyEventListener implements PreInsertEventListener {
@Autowired
private EntityManagerFactory entityManagerFactory;

@PostConstruct
private void init() {
SessionFactoryImpl sessionFactory = entityManagerFactory.unwrap(SessionFactoryImpl.class);
EventListenerRegistry registry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class);
registry.getEventListenerGroup(EventType.PRE_INSERT).appendListener(this);
}

@Override
public boolean onPreInsert(PreInsertEvent preInsertEvent) {
// do your checks here
return false;
}
}

监听器的好处是您可以拥有任意数量的监听器,API 比拦截器更好,并且代码和配置都在一个地方。
缺点是配置更长,涉及更多。

  • https://docs.jboss.org/hibernate/orm/3.5/reference/en-US/html/events.html
  • How to use Spring managed Hibernate interceptors in Spring Boot?
  • https://dzone.com/articles/spring-managed-hibernate-event-listeners
  • 关于spring - 使用 Spring Boot 和 Spring Data JPA 的 Hibernate 拦截器或监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39663669/

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