HHH-13051 Make audit tables structure more extensible
This commit is contained in:
parent
82d3793549
commit
68df2792c6
|
@ -28,11 +28,9 @@ import org.hibernate.envers.internal.revisioninfo.RevisionInfoQueryCreator;
|
||||||
import org.hibernate.envers.internal.synchronization.AuditProcessManager;
|
import org.hibernate.envers.internal.synchronization.AuditProcessManager;
|
||||||
import org.hibernate.envers.internal.tools.ReflectionTools;
|
import org.hibernate.envers.internal.tools.ReflectionTools;
|
||||||
import org.hibernate.envers.strategy.AuditStrategy;
|
import org.hibernate.envers.strategy.AuditStrategy;
|
||||||
import org.hibernate.envers.strategy.ValidityAuditStrategy;
|
|
||||||
import org.hibernate.internal.util.ReflectHelper;
|
import org.hibernate.internal.util.ReflectHelper;
|
||||||
import org.hibernate.internal.util.config.ConfigurationHelper;
|
import org.hibernate.internal.util.config.ConfigurationHelper;
|
||||||
import org.hibernate.internal.util.xml.XMLHelper;
|
import org.hibernate.internal.util.xml.XMLHelper;
|
||||||
import org.hibernate.property.access.spi.Getter;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
import org.hibernate.service.ServiceRegistry;
|
||||||
import org.hibernate.service.spi.Configurable;
|
import org.hibernate.service.spi.Configurable;
|
||||||
import org.hibernate.service.spi.Stoppable;
|
import org.hibernate.service.spi.Stoppable;
|
||||||
|
@ -182,15 +180,8 @@ public class EnversServiceImpl implements EnversService, Configurable, Stoppable
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( strategy instanceof ValidityAuditStrategy ) {
|
// Strategy-specific initialization
|
||||||
// further initialization required
|
strategy.initialize( revisionInfoClass, revisionInfoTimestampData, serviceRegistry );
|
||||||
final Getter revisionTimestampGetter = ReflectionTools.getGetter(
|
|
||||||
revisionInfoClass,
|
|
||||||
revisionInfoTimestampData,
|
|
||||||
serviceRegistry
|
|
||||||
);
|
|
||||||
( (ValidityAuditStrategy) strategy ).setRevisionTimestampGetter( revisionTimestampGetter );
|
|
||||||
}
|
|
||||||
|
|
||||||
return strategy;
|
return strategy;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,6 @@ import org.hibernate.envers.internal.entities.mapper.SubclassPropertyMapper;
|
||||||
import org.hibernate.envers.internal.tools.StringTools;
|
import org.hibernate.envers.internal.tools.StringTools;
|
||||||
import org.hibernate.envers.internal.tools.Triple;
|
import org.hibernate.envers.internal.tools.Triple;
|
||||||
import org.hibernate.envers.strategy.AuditStrategy;
|
import org.hibernate.envers.strategy.AuditStrategy;
|
||||||
import org.hibernate.envers.strategy.ValidityAuditStrategy;
|
|
||||||
import org.hibernate.mapping.Collection;
|
import org.hibernate.mapping.Collection;
|
||||||
import org.hibernate.mapping.Join;
|
import org.hibernate.mapping.Join;
|
||||||
import org.hibernate.mapping.OneToOne;
|
import org.hibernate.mapping.OneToOne;
|
||||||
|
@ -172,44 +171,10 @@ public final class AuditMetadataGenerator {
|
||||||
isKey
|
isKey
|
||||||
);
|
);
|
||||||
revTypeProperty.addAttribute( "type", "org.hibernate.envers.internal.entities.RevisionTypeType" );
|
revTypeProperty.addAttribute( "type", "org.hibernate.envers.internal.entities.RevisionTypeType" );
|
||||||
|
|
||||||
// Adding the end revision, if appropriate
|
|
||||||
addEndRevision( anyMappingEnd );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addEndRevision(Element anyMapping) {
|
void addAdditionalColumns(Element anyMapping) {
|
||||||
// Add the end-revision field, if the appropriate strategy is used.
|
auditStrategy.addAdditionalColumns(anyMapping, revisionInfoRelationMapping, verEntCfg);
|
||||||
if ( auditStrategy instanceof ValidityAuditStrategy ) {
|
|
||||||
final Element endRevMapping = (Element) revisionInfoRelationMapping.clone();
|
|
||||||
endRevMapping.setName( "many-to-one" );
|
|
||||||
endRevMapping.addAttribute( "name", verEntCfg.getRevisionEndFieldName() );
|
|
||||||
MetadataTools.addOrModifyColumn( endRevMapping, verEntCfg.getRevisionEndFieldName() );
|
|
||||||
|
|
||||||
anyMapping.add( endRevMapping );
|
|
||||||
|
|
||||||
if ( verEntCfg.isRevisionEndTimestampEnabled() ) {
|
|
||||||
// add a column for the timestamp of the end revision
|
|
||||||
final String revisionInfoTimestampSqlType = TimestampType.INSTANCE.getName();
|
|
||||||
final Element timestampProperty = MetadataTools.addProperty(
|
|
||||||
anyMapping,
|
|
||||||
verEntCfg.getRevisionEndTimestampFieldName(),
|
|
||||||
revisionInfoTimestampSqlType,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
false
|
|
||||||
);
|
|
||||||
MetadataTools.addColumn(
|
|
||||||
timestampProperty,
|
|
||||||
verEntCfg.getRevisionEndTimestampFieldName(),
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addValueInFirstPass(
|
private void addValueInFirstPass(
|
||||||
|
@ -553,6 +518,8 @@ public final class AuditMetadataGenerator {
|
||||||
// Adding the "revision type" property
|
// Adding the "revision type" property
|
||||||
addRevisionType( classMapping, classMapping );
|
addRevisionType( classMapping, classMapping );
|
||||||
|
|
||||||
|
addAdditionalColumns( classMapping );
|
||||||
|
|
||||||
return Triple.make( classMapping, propertyMapper, null );
|
return Triple.make( classMapping, propertyMapper, null );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -879,6 +879,8 @@ public final class CollectionMetadataGenerator {
|
||||||
isRevisionTypeInId()
|
isRevisionTypeInId()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
mainGenerator.addAdditionalColumns( middleEntityXml );
|
||||||
|
|
||||||
// All other properties should also be part of the primary key of the middle entity.
|
// All other properties should also be part of the primary key of the middle entity.
|
||||||
return middleEntityXmlId;
|
return middleEntityXmlId;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,14 +9,17 @@ package org.hibernate.envers.strategy;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.service.ServiceRegistry;
|
||||||
import org.hibernate.envers.boot.internal.EnversService;
|
import org.hibernate.envers.boot.internal.EnversService;
|
||||||
import org.hibernate.envers.configuration.internal.AuditEntitiesConfiguration;
|
import org.hibernate.envers.configuration.internal.AuditEntitiesConfiguration;
|
||||||
import org.hibernate.envers.configuration.internal.GlobalConfiguration;
|
import org.hibernate.envers.configuration.internal.GlobalConfiguration;
|
||||||
|
import org.hibernate.envers.internal.entities.PropertyData;
|
||||||
import org.hibernate.envers.internal.entities.mapper.PersistentCollectionChangeData;
|
import org.hibernate.envers.internal.entities.mapper.PersistentCollectionChangeData;
|
||||||
import org.hibernate.envers.internal.entities.mapper.relation.MiddleComponentData;
|
import org.hibernate.envers.internal.entities.mapper.relation.MiddleComponentData;
|
||||||
import org.hibernate.envers.internal.entities.mapper.relation.MiddleIdData;
|
import org.hibernate.envers.internal.entities.mapper.relation.MiddleIdData;
|
||||||
import org.hibernate.envers.internal.tools.query.Parameters;
|
import org.hibernate.envers.internal.tools.query.Parameters;
|
||||||
import org.hibernate.envers.internal.tools.query.QueryBuilder;
|
import org.hibernate.envers.internal.tools.query.QueryBuilder;
|
||||||
|
import org.dom4j.Element;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Behaviours of different audit strategy for populating audit data.
|
* Behaviours of different audit strategy for populating audit data.
|
||||||
|
@ -199,4 +202,32 @@ public interface AuditStrategy {
|
||||||
String alias1,
|
String alias1,
|
||||||
boolean inclusive,
|
boolean inclusive,
|
||||||
MiddleComponentData... componentDatas);
|
MiddleComponentData... componentDatas);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method to add additional Columns to the aud-tables.
|
||||||
|
*
|
||||||
|
* @param anyMapping the class mapping
|
||||||
|
* @param revMapping the mapping of the revInfo-relation
|
||||||
|
* @param auditEntitiesConfiguration the configuration of the audit entities
|
||||||
|
*/
|
||||||
|
default void addAdditionalColumns(
|
||||||
|
Element anyMapping,
|
||||||
|
Element revMapping,
|
||||||
|
AuditEntitiesConfiguration auditEntitiesConfiguration) {
|
||||||
|
//For backward compatibility
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method do add additional initialization behavior
|
||||||
|
*
|
||||||
|
* @param revisionInfoClass the class of the revision info
|
||||||
|
* @param revisionInfoTimestampData the timestamp of the revision info
|
||||||
|
* @param serviceRegistry the service registry
|
||||||
|
*/
|
||||||
|
default void initialize(
|
||||||
|
Class<?> revisionInfoClass,
|
||||||
|
PropertyData revisionInfoTimestampData,
|
||||||
|
ServiceRegistry serviceRegistry) {
|
||||||
|
//For backward compatibility
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,14 +9,17 @@ package org.hibernate.envers.strategy;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.service.ServiceRegistry;
|
||||||
import org.hibernate.envers.configuration.internal.AuditEntitiesConfiguration;
|
import org.hibernate.envers.configuration.internal.AuditEntitiesConfiguration;
|
||||||
import org.hibernate.envers.configuration.internal.GlobalConfiguration;
|
import org.hibernate.envers.configuration.internal.GlobalConfiguration;
|
||||||
|
import org.hibernate.envers.internal.entities.PropertyData;
|
||||||
import org.hibernate.envers.internal.entities.mapper.PersistentCollectionChangeData;
|
import org.hibernate.envers.internal.entities.mapper.PersistentCollectionChangeData;
|
||||||
import org.hibernate.envers.internal.entities.mapper.relation.MiddleComponentData;
|
import org.hibernate.envers.internal.entities.mapper.relation.MiddleComponentData;
|
||||||
import org.hibernate.envers.internal.entities.mapper.relation.MiddleIdData;
|
import org.hibernate.envers.internal.entities.mapper.relation.MiddleIdData;
|
||||||
import org.hibernate.envers.internal.synchronization.SessionCacheCleaner;
|
import org.hibernate.envers.internal.synchronization.SessionCacheCleaner;
|
||||||
import org.hibernate.envers.internal.tools.query.Parameters;
|
import org.hibernate.envers.internal.tools.query.Parameters;
|
||||||
import org.hibernate.envers.internal.tools.query.QueryBuilder;
|
import org.hibernate.envers.internal.tools.query.QueryBuilder;
|
||||||
|
import org.dom4j.Element;
|
||||||
|
|
||||||
import static org.hibernate.envers.internal.entities.mapper.relation.query.QueryConstants.MIDDLE_ENTITY_ALIAS_DEF_AUD_STR;
|
import static org.hibernate.envers.internal.entities.mapper.relation.query.QueryConstants.MIDDLE_ENTITY_ALIAS_DEF_AUD_STR;
|
||||||
import static org.hibernate.envers.internal.entities.mapper.relation.query.QueryConstants.REVISION_PARAMETER;
|
import static org.hibernate.envers.internal.entities.mapper.relation.query.QueryConstants.REVISION_PARAMETER;
|
||||||
|
|
|
@ -13,6 +13,7 @@ import java.sql.SQLException;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import org.dom4j.Element;
|
||||||
|
|
||||||
import org.hibernate.LockOptions;
|
import org.hibernate.LockOptions;
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
|
@ -22,10 +23,13 @@ import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
||||||
import org.hibernate.envers.RevisionType;
|
import org.hibernate.envers.RevisionType;
|
||||||
import org.hibernate.envers.configuration.internal.AuditEntitiesConfiguration;
|
import org.hibernate.envers.configuration.internal.AuditEntitiesConfiguration;
|
||||||
import org.hibernate.envers.configuration.internal.GlobalConfiguration;
|
import org.hibernate.envers.configuration.internal.GlobalConfiguration;
|
||||||
|
import org.hibernate.envers.configuration.internal.metadata.MetadataTools;
|
||||||
|
import org.hibernate.envers.internal.entities.PropertyData;
|
||||||
import org.hibernate.envers.internal.entities.mapper.PersistentCollectionChangeData;
|
import org.hibernate.envers.internal.entities.mapper.PersistentCollectionChangeData;
|
||||||
import org.hibernate.envers.internal.entities.mapper.relation.MiddleComponentData;
|
import org.hibernate.envers.internal.entities.mapper.relation.MiddleComponentData;
|
||||||
import org.hibernate.envers.internal.entities.mapper.relation.MiddleIdData;
|
import org.hibernate.envers.internal.entities.mapper.relation.MiddleIdData;
|
||||||
import org.hibernate.envers.internal.synchronization.SessionCacheCleaner;
|
import org.hibernate.envers.internal.synchronization.SessionCacheCleaner;
|
||||||
|
import org.hibernate.envers.internal.tools.ReflectionTools;
|
||||||
import org.hibernate.envers.internal.tools.query.Parameters;
|
import org.hibernate.envers.internal.tools.query.Parameters;
|
||||||
import org.hibernate.envers.internal.tools.query.QueryBuilder;
|
import org.hibernate.envers.internal.tools.query.QueryBuilder;
|
||||||
import org.hibernate.event.spi.EventSource;
|
import org.hibernate.event.spi.EventSource;
|
||||||
|
@ -40,6 +44,8 @@ import org.hibernate.type.MapType;
|
||||||
import org.hibernate.type.MaterializedClobType;
|
import org.hibernate.type.MaterializedClobType;
|
||||||
import org.hibernate.type.MaterializedNClobType;
|
import org.hibernate.type.MaterializedNClobType;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
import org.hibernate.type.TimestampType;
|
||||||
|
import org.hibernate.service.ServiceRegistry;
|
||||||
|
|
||||||
import static org.hibernate.envers.internal.entities.mapper.relation.query.QueryConstants.MIDDLE_ENTITY_ALIAS;
|
import static org.hibernate.envers.internal.entities.mapper.relation.query.QueryConstants.MIDDLE_ENTITY_ALIAS;
|
||||||
import static org.hibernate.envers.internal.entities.mapper.relation.query.QueryConstants.REVISION_PARAMETER;
|
import static org.hibernate.envers.internal.entities.mapper.relation.query.QueryConstants.REVISION_PARAMETER;
|
||||||
|
@ -395,6 +401,53 @@ public class ValidityAuditStrategy implements AuditStrategy {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addAdditionalColumns(Element anyMapping, Element revMapping, AuditEntitiesConfiguration auditEntitiesConfiguration) {
|
||||||
|
// Add the end-revision field, if the appropriate strategy is used.
|
||||||
|
|
||||||
|
Element endRevMapping = (Element) revMapping.clone();
|
||||||
|
|
||||||
|
endRevMapping.setName( "many-to-one" );
|
||||||
|
endRevMapping.addAttribute( "name", auditEntitiesConfiguration.getRevisionEndFieldName() );
|
||||||
|
MetadataTools.addOrModifyColumn( endRevMapping, auditEntitiesConfiguration.getRevisionEndFieldName() );
|
||||||
|
|
||||||
|
anyMapping.add( endRevMapping );
|
||||||
|
|
||||||
|
if ( auditEntitiesConfiguration.isRevisionEndTimestampEnabled() ) {
|
||||||
|
// add a column for the timestamp of the end revision
|
||||||
|
final String revisionInfoTimestampSqlType = TimestampType.INSTANCE.getName();
|
||||||
|
final Element timestampProperty = MetadataTools.addProperty(
|
||||||
|
anyMapping,
|
||||||
|
auditEntitiesConfiguration.getRevisionEndTimestampFieldName(),
|
||||||
|
revisionInfoTimestampSqlType,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
MetadataTools.addColumn(
|
||||||
|
timestampProperty,
|
||||||
|
auditEntitiesConfiguration.getRevisionEndTimestampFieldName(),
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initialize(Class<?> revisionInfoClass, PropertyData revisionInfoTimestampData, ServiceRegistry serviceRegistry) {
|
||||||
|
// further initialization required
|
||||||
|
final Getter revisionTimestampGetter = ReflectionTools.getGetter(
|
||||||
|
revisionInfoClass,
|
||||||
|
revisionInfoTimestampData,
|
||||||
|
serviceRegistry
|
||||||
|
);
|
||||||
|
setRevisionTimestampGetter( revisionTimestampGetter );
|
||||||
|
}
|
||||||
|
|
||||||
private Date convertRevEndTimestampToDate(Object revEndTimestampObj) {
|
private Date convertRevEndTimestampToDate(Object revEndTimestampObj) {
|
||||||
// convert to a java.util.Date
|
// convert to a java.util.Date
|
||||||
if ( revEndTimestampObj instanceof Date ) {
|
if ( revEndTimestampObj instanceof Date ) {
|
||||||
|
|
Loading…
Reference in New Issue