org.hibernate.envers.strategy.AuditStrategy Maven / Gradle / Ivy
package org.hibernate.envers.strategy;
import java.io.Serializable;
import org.hibernate.Session;
import org.hibernate.envers.configuration.AuditConfiguration;
import org.hibernate.envers.configuration.GlobalConfiguration;
import org.hibernate.envers.entities.mapper.PersistentCollectionChangeData;
import org.hibernate.envers.entities.mapper.relation.MiddleComponentData;
import org.hibernate.envers.entities.mapper.relation.MiddleIdData;
import org.hibernate.envers.tools.query.QueryBuilder;
/**
* Behaviours of different audit strategy for populating audit data.
*
* @author Stephanie Pau
* @author Adam Warski (adam at warski dot org)
*/
public interface AuditStrategy {
/**
* Perform the persistence of audited data for regular entities.
*
* @param session Session, which can be used to persist the data.
* @param entityName Name of the entity, in which the audited change happens
* @param auditCfg Audit configuration
* @param id Id of the entity.
* @param data Audit data to persist
* @param revision Current revision data
*/
void perform(Session session, String entityName, AuditConfiguration auditCfg, Serializable id, Object data,
Object revision);
/**
* Perform the persistence of audited data for collection ("middle") entities.
*
* @param session Session, which can be used to persist the data.
* @param auditCfg Audit configuration
* @param persistentCollectionChangeData Collection change data to be persisted.
* @param revision Current revision data
*/
void performCollectionChange(Session session, AuditConfiguration auditCfg,
PersistentCollectionChangeData persistentCollectionChangeData, Object revision);
/**
* Update the rootQueryBuilder with an extra WHERE clause to restrict the revision for a two-entity relation.
* This WHERE clause depends on the AuditStrategy, as follows:
*
* - For {@link DefaultAuditStrategy} a subquery is created:
*
e.revision = (SELECT max(...) ...)
*
* - for {@link ValidityAuditStrategy} the revision-end column is used:
*
e.revision <= :revision and (e.endRevision > :revision or e.endRevision is null)
*
*
*
* @param globalCfg the {@link GlobalConfiguration}
* @param rootQueryBuilder the {@link QueryBuilder} that will be updated
* @param revisionProperty property of the revision column
* @param revisionEndProperty property of the revisionEnd column (only used for {@link ValidityAuditStrategy})
* @param addAlias {@code boolean} indicator if a left alias is needed
* @param idData id-information for the two-entity relation (only used for {@link DefaultAuditStrategy})
* @param revisionPropertyPath path of the revision property (only used for {@link ValidityAuditStrategy})
* @param originalIdPropertyName name of the id property (only used for {@link ValidityAuditStrategy})
* @param alias1 an alias used for subquery (only used for {@link ValidityAuditStrategy})
* @param alias2 an alias used for subquery (only used for {@link ValidityAuditStrategy})
*/
void addEntityAtRevisionRestriction(GlobalConfiguration globalCfg, QueryBuilder rootQueryBuilder,
String revisionProperty, String revisionEndProperty, boolean addAlias, MiddleIdData idData,
String revisionPropertyPath, String originalIdPropertyName, String alias1, String alias2);
/**
* Update the rootQueryBuilder with an extra WHERE clause to restrict the revision for a middle-entity
* association. This WHERE clause depends on the AuditStrategy, as follows:
*
* - For {@link DefaultAuditStrategy} a subquery is created:
*
e.revision = (SELECT max(...) ...)
*
* - for {@link ValidityAuditStrategy} the revision-end column is used:
*
e.revision <= :revision and (e.endRevision > :revision or e.endRevision is null)
*
*
*
* @param rootQueryBuilder the {@link QueryBuilder} that will be updated
* @param revisionProperty property of the revision column
* @param revisionEndProperty property of the revisionEnd column (only used for {@link ValidityAuditStrategy})
* @param addAlias {@code boolean} indicator if a left alias is needed
* @param referencingIdData id-information for the middle-entity association (only used for {@link DefaultAuditStrategy})
* @param versionsMiddleEntityName name of the middle-entity
* @param eeOriginalIdPropertyPath name of the id property (only used for {@link ValidityAuditStrategy})
* @param revisionPropertyPath path of the revision property (only used for {@link ValidityAuditStrategy})
* @param originalIdPropertyName name of the id property (only used for {@link ValidityAuditStrategy})
* @param componentDatas information about the middle-entity relation
*/
void addAssociationAtRevisionRestriction(QueryBuilder rootQueryBuilder, String revisionProperty,
String revisionEndProperty, boolean addAlias, MiddleIdData referencingIdData,
String versionsMiddleEntityName, String eeOriginalIdPropertyPath, String revisionPropertyPath,
String originalIdPropertyName, MiddleComponentData... componentDatas);
}