我为自己做了很多环顾四周,并认为我会分享我的工作(我在底部添加了有用的(非内联)链接)。
拦截器
要使用拦截器,您可以扩展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;
}
}
您必须使用 Spring/Hibernate register your interceptor。
您可以在application.properties or application.yml 中执行此操作。
spring:
jpa:
properties:
hibernate.ejb.interceptor: foo.bar.MyInterceptor
拦截器的好处是它(可能)更少的代码和相对简单的配置。
缺点是您的整个应用程序只能使用一个,并且使用该 API 可能会令人困惑。
事件监听器
对于事件,您实现 Hibernate 的 org.hibernate.event.spi.*Listener 接口之一。
您可能需要 org.hibernate.event.spi.PreInsertEventListener 在您的情况下。
您必须在EventListenerRegistry 中注册您的活动。
为此,您可以将您的类设为@Component、@Autowire 和EntityManagerFactory,并创建一个@PostConstruct 方法来注册您的类。
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 比拦截器更好,并且代码和配置都在一个地方。
缺点是配置更长,涉及更多。