是的,在数据库中提交某些更改后,可以通知另一个进程(例如:审核)。那就是在使用自定义拦截器和休眠事件提交JDBC事务(Hibernate包装JDBC事务)之后立即执行某些操作。
您可以通过通过休眠的 EmptyInterceptor 类扩展它来创建自己的自定义侦听器类。通过覆盖下面 EmptyInterceptor 的事务处理完成后(事务 tx)方法,在事务提交后执行某些任务。
public class AuditLogInterceptor extends EmptyInterceptor {
@Override
public void afterTransactionCompletion(Transaction tx) {
System.out.println("Task to do after transaction ");
}
}
事件系统可以作为侦听器的补充使用,也可以作为侦听器的替代品。
下面列出了在事务事件完成/提交后执行某些任务的几种方法
1.从 org.hibernate.action package 实现 AfterTransactionCompletionProcess 接口,并实现以下方法。文档
void doAfterTransactionCompletion(boolean success, SessionImplementor session) {
//Perform whatever processing is encapsulated here after completion of the transaction.
}
否则,您可以使用 EntityDeleteAction 扩展 CustomDeleteAction 类,并重写上述 doAfterTransaction Completeletion 方法。文档
2.通过实现 PostDeleteEventListener 并使用 post delete。
通过实现 PostInsertEventListener 并使用 post insert。
通过实现 PostUpdateEventListener 并使用 post update。
以下是PostDeleteEventListener,PostUpdateEventListener和PostInsertEventListener的几个例子。EventType.POST_COMMIT_DELETE
EventType.POST_COMMIT_INSERT
EventType.POST_COMMIT_UPDATE
PostInsertEvent 给出了数据库操作中涉及的实体。Object entity
PostInsertEvent 返回此事件的会话事件源。这是从中生成此事件的基础会话。
以下链接包含 PostInsertEvent 成员的文档。Object[] state
http://mausch.github.io/nhibernate-3.2.0GA/html/6deb23c7-79ef-9599-6cfd-6f45572f6894.htm
注册事件侦听器:MyIntegrator 类下面显示了注册事件侦听器的 3 种方法。
public class MyIntegrator implements org.hibernate.integrator.spi.Integrator {
public void integrate(Configuration configuration, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
// As you might expect, an EventListenerRegistry is the thing with which event listeners are registered
// It is a service so we look it up using the service registry
final EventListenerRegistry eventListenerRegistry = serviceRegistry.getService( EventListenerRegistry.class );
// If you wish to have custom determination and handling of "duplicate" listeners, you would have to add an
// implementation of the org.hibernate.event.service.spi.DuplicationStrategy contract like this
eventListenerRegistry.addDuplicationStrategy( myDuplicationStrategy );
// EventListenerRegistry defines 3 ways to register listeners:
// 1) This form overrides any existing registrations with
eventListenerRegistry.setListeners( EventType.AUTO_FLUSH, myCompleteSetOfListeners );
// 2) This form adds the specified listener(s) to the beginning of the listener chain
eventListenerRegistry.prependListeners( EventType.AUTO_FLUSH, myListenersToBeCalledFirst );
// 3) This form adds the specified listener(s) to the end of the listener chain
eventListenerRegistry.appendListeners( EventType.AUTO_FLUSH, myListenersToBeCalledLast );
}
}
因此,事件侦听器注册取决于实现细节。