org.hibernate.envers.internal.synchronization.SessionCacheCleaner Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hibernate-envers Show documentation
Show all versions of hibernate-envers Show documentation
Hibernate's entity version (audit/history) support
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or .
*/
package org.hibernate.envers.internal.synchronization;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.action.spi.AfterTransactionCompletionProcess;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.event.spi.EventSource;
/**
* Class responsible for evicting audit data entries that have been stored in the session level cache.
* This operation increases Envers performance in case of massive entity updates without clearing persistence context.
*
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
*/
public class SessionCacheCleaner {
/**
* Schedules audit data removal from session level cache after transaction completion. The operation is performed
* regardless of commit success.
*
* @param session Active Hibernate session.
* @param data Audit data that shall be evicted (e.g. revision data or entity snapshot)
*/
public void scheduleAuditDataRemoval(final Session session, final Object data) {
( (EventSource) session ).getActionQueue().registerProcess(
new AfterTransactionCompletionProcess() {
public void doAfterTransactionCompletion(boolean success, SharedSessionContractImplementor sessionImplementor) {
if ( !sessionImplementor.isClosed() ) {
try {
( (Session) sessionImplementor ).evict( data );
}
catch ( HibernateException ignore ) {
}
}
}
}
);
}
}