java - 仅为一组实体配置 Hibernate 实体侦听器
问题描述
根据https://vladmihalcea.com/hibernate-event-listeners/,我想为我的实体组的插入/更新/删除后事件配置实体侦听器。我不希望我的应用程序中的所有实体都使用这些侦听器。所以我为一组实体创建了一个抽象类并实现了 onPostUpdate/onPostInsert 方法。但是我不能为积分器部分配置这个抽象的监听器类,因为它只需要具体的监听器。解决方案有什么建议吗?
配置休眠实体
import org.hibernate.event.spi.PostDeleteEvent;
import org.hibernate.event.spi.PostDeleteEventListener;
import org.hibernate.event.spi.PostInsertEvent;
import org.hibernate.event.spi.PostInsertEventListener;
import org.hibernate.event.spi.PostUpdateEvent;
import org.hibernate.event.spi.PostUpdateEventListener;
import org.hibernate.persister.entity.EntityPersister;
public abstract class ConfigHibernateEntity extends HibernateEntity implements PostUpdateEventListener, PostInsertEventListener, PostDeleteEventListener{
// public static final ConfigHibernateEntity INSTANCE = new ConfigHibernateEntity();
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void onPostUpdate(PostUpdateEvent event) {
final Object entity = event.getEntity();
System.out.println("On post update method");
}
@Override
public void onPostInsert(PostInsertEvent event) {
final Object entity = event.getEntity();
System.out.println("On post insert method");
}
@Override
public boolean requiresPostCommitHanding(EntityPersister persister) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onPostDelete(PostDeleteEvent event) {
final Object entity = event.getEntity();
System.out.println("On post delete method");
}
}
事件监听器集成器:
import org.hibernate.boot.Metadata;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.event.service.spi.EventListenerRegistry;
import org.hibernate.event.spi.EventType;
import org.hibernate.integrator.spi.Integrator;
import org.hibernate.service.spi.SessionFactoryServiceRegistry;
public class EventListenerIntegrator implements Integrator {
@Override
public void integrate(Metadata metadata, SessionFactoryImplementor
sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
EventListenerRegistry eventListenerRegistry =
serviceRegistry.getService(EventListenerRegistry.class);
eventListenerRegistry.getEventListenerGroup(EventType.POST_INSERT)
.appendListener(new ConfigHibernateEntity());
eventListenerRegistry.getEventListenerGroup(EventType.POST_UPDATE)
.appendListener(new ConfigHibernateEntity());
eventListenerRegistry.getEventListenerGroup(EventType.POST_DELETE)
.appendListener(new ConfigHibernateEntity());
}
@Override
public void disintegrate(SessionFactoryImplementor sessionFactory,
SessionFactoryServiceRegistry serviceRegistry) {
}
}
CustomEntity1 类:
public class CustomEntity1 extends ConfigHibernateEntity {
//
}
CustomEntity2 类:
public class CustomEntity2 extends HibernateEntity {
//
}
解决方案
而不是在 ConfigHibernateEntity 本身中实现监听器,而是创建单独的监听器类并检查实体是否是 ConfigHibernateEntity 的实例,
public class ConfigHibernateEntityListener implements PostUpdateEventListener,
PostInsertEventListener, PostDeleteEventListener {
private static final long serialVersionUID = -2607908089881583295L;
private final Predicate<Object> checkInstanceOfConfigHibernateEntity =
event -> event instanceof ConfigHibernateEntity;
@Override
public void onPostUpdate(final PostUpdateEvent event) {
final Object entity = event.getEntity();
if (checkInstanceOfConfigHibernateEntity.test(entity)) {
System.out.println("On post update method");
}
}
@Override
public void onPostInsert(final PostInsertEvent event) {
final Object entity = event.getEntity();
if (checkInstanceOfConfigHibernateEntity.test(entity)) {
System.out.println("On post insert method");
}
}
@Override
public boolean requiresPostCommitHanding(final EntityPersister persister) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onPostDelete(final PostDeleteEvent event) {
final Object entity = event.getEntity();
if (checkInstanceOfConfigHibernateEntity.test(entity)) {
System.out.println("On post delete method");
}
}
可以ConfigHibernateEntity
像下面一样,
/**
* Marker class for adding configure entity listeners for
* post/insert/update/delete
*/
public class ConfigHibernateEntity {
}
推荐阅读
- java - 嵌套循环时间复杂度 for( i = n; i > 0; i /= 2) VS for( i = n; i > 0; i/=2) for( j = 0; j < i; j++)
- c - ac 程序上的 8、16、32 和 64 位微控制器上的字长、int 大小和指针是多少?
- hibernate-envers - 如果通过添加新实体更改 @oneToMany - 实体,则修订包含其他字段的空值
- c# - uwp ListView 没有 SelectionChanging 事件
- angular - ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked - How to update template after Observable Value change
- asp.net-mvc - Angular 和 .net mvc 中的路由
- objective-c - NSUrlSession 代理请求失败,错误代码为 310 (kCFErrorHTTPSProxyConnectionFailure)
- firebase - 运行 Gradle 时出错 - gradlew.bat 异常退出(添加 firebase 后出错)
- javascript - 如何在赛普拉斯自动化工具中处理定位器的动态 ID
- php - 找不到 url 在 url 上发送编码参数