Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ else if ( hasNotAuditedEntityConfiguration( referencedEntityName ) ) {
referencedEntityName,
prefixedMapper,
true,
false,
false
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
*/
package org.hibernate.envers.configuration.internal.metadata;

import org.hibernate.envers.RelationTargetAuditMode;
import org.hibernate.envers.boot.EnversMappingException;
import org.hibernate.envers.boot.model.AttributeContainer;
import org.hibernate.envers.boot.spi.EnversMetadataBuildingContext;
Expand Down Expand Up @@ -62,7 +63,8 @@ public void addToOne(
referencedEntityName,
relMapper,
insertable,
shouldIgnoreNotFoundRelation( propertyAuditingData, value )
shouldIgnoreNotFoundRelation( propertyAuditingData, value ),
propertyAuditingData.getRelationTargetAuditMode() == RelationTargetAuditMode.NOT_AUDITED
);

// If the property isn't insertable, checking if this is not a "fake" bidirectional many-to-one relationship,
Expand Down Expand Up @@ -127,7 +129,8 @@ public void addOneToOneNotOwning(
owningReferencePropertyName,
referencedEntityName,
ownedIdMapper,
MappingTools.ignoreNotFound( value )
MappingTools.ignoreNotFound( value ),
propertyAuditingData.getRelationTargetAuditMode() == RelationTargetAuditMode.NOT_AUDITED
);

// Adding mapper for the id
Expand Down Expand Up @@ -170,7 +173,8 @@ void addOneToOnePrimaryKeyJoinColumn(
referencedEntityName,
relMapper,
insertable,
MappingTools.ignoreNotFound( value )
MappingTools.ignoreNotFound( value ),
propertyAuditingData.getRelationTargetAuditMode() == RelationTargetAuditMode.NOT_AUDITED
);

// Adding mapper for the id
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ public void addToOneRelation(
String toEntityName,
IdMapper idMapper,
boolean insertable,
boolean ignoreNotFound) {
boolean ignoreNotFound,
boolean targetNotAudited) {
relations.put(
fromPropertyName,
RelationDescription.toOne(
Expand All @@ -66,7 +67,8 @@ public void addToOneRelation(
null,
null,
insertable,
ignoreNotFound
ignoreNotFound,
targetNotAudited
)
);
}
Expand All @@ -76,7 +78,8 @@ public void addToOneNotOwningRelation(
String mappedByPropertyName,
String toEntityName,
IdMapper idMapper,
boolean ignoreNotFound) {
boolean ignoreNotFound,
boolean targetNotAudited) {
relations.put(
fromPropertyName,
RelationDescription.toOne(
Expand All @@ -88,7 +91,8 @@ public void addToOneNotOwningRelation(
null,
null,
true,
ignoreNotFound
ignoreNotFound,
targetNotAudited
)
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,8 @@ private void replaceNonAuditIdProxies(Map versionsEntity, Number revision) {
enversService.getConfig().getRevisionTypePropertyName()
)
),
enversService
enversService,
false
);
originalId.put(
key,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public class RelationDescription {
private final String toEntityName;
private final String mappedByPropertyName;
private final boolean ignoreNotFound;
private final boolean targetNotAudited;
private final IdMapper idMapper;
private final PropertyMapper fakeBidirectionalRelationMapper;
private final PropertyMapper fakeBidirectionalRelationIndexMapper;
Expand All @@ -37,10 +38,11 @@ public static RelationDescription toOne(
PropertyMapper fakeBidirectionalRelationMapper,
PropertyMapper fakeBidirectionalRelationIndexMapper,
boolean insertable,
boolean ignoreNotFound) {
boolean ignoreNotFound,
boolean targetNotAudited) {
return new RelationDescription(
fromPropertyName, relationType, toEntityName, mappedByPropertyName, idMapper,
fakeBidirectionalRelationMapper, fakeBidirectionalRelationIndexMapper, null, null, null, insertable, ignoreNotFound, false
fakeBidirectionalRelationMapper, fakeBidirectionalRelationIndexMapper, null, null, null, insertable, ignoreNotFound, targetNotAudited, false
);
}

Expand All @@ -60,10 +62,10 @@ public static RelationDescription toMany(
// Envers populates collections by executing dedicated queries. Special handling of
// @NotFound(action = NotFoundAction.IGNORE) can be omitted in such case as exceptions
// (e.g. EntityNotFoundException, ObjectNotFoundException) are never thrown.
// Therefore assigning false to ignoreNotFound.
// Therefore assigning false to ignoreNotFound and targetNotAudited.
return new RelationDescription(
fromPropertyName, relationType, toEntityName, mappedByPropertyName, idMapper, fakeBidirectionalRelationMapper,
fakeBidirectionalRelationIndexMapper, referencingIdData, referencedIdData, auditMiddleEntityName, insertable, false, indexed
fakeBidirectionalRelationIndexMapper, referencingIdData, referencedIdData, auditMiddleEntityName, insertable, false, false, indexed
);
}

Expand All @@ -80,12 +82,14 @@ private RelationDescription(
String auditMiddleEntityName,
boolean insertable,
boolean ignoreNotFound,
boolean targetNotAudited,
boolean indexed) {
this.fromPropertyName = fromPropertyName;
this.relationType = relationType;
this.toEntityName = toEntityName;
this.mappedByPropertyName = mappedByPropertyName;
this.ignoreNotFound = ignoreNotFound;
this.targetNotAudited = targetNotAudited;
this.idMapper = idMapper;
this.fakeBidirectionalRelationMapper = fakeBidirectionalRelationMapper;
this.fakeBidirectionalRelationIndexMapper = fakeBidirectionalRelationIndexMapper;
Expand Down Expand Up @@ -117,6 +121,10 @@ public boolean isIgnoreNotFound() {
return ignoreNotFound;
}

public boolean isTargetNotAudited() {
return targetNotAudited;
}

public IdMapper getIdMapper() {
return idMapper;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,19 @@ public static Object loadImmediate(
Object entityId,
Number revision,
boolean removed,
EnversService enversService) {
if ( enversService.getEntitiesConfigurations().getNotVersionEntityConfiguration( entityName ) == null ) {
EnversService enversService,
boolean isTargetNotAudited) {

if ( isTargetNotAudited || enversService.getEntitiesConfigurations().getNotVersionEntityConfiguration( entityName ) != null ) {
// Not audited relation, look up entity with Hibernate.
return versionsReader.getSessionImplementor().immediateLoad( entityName, entityId );
}
else {
// Audited relation, look up entity with Envers.
// When user traverses removed entities graph, do not restrict revision type of referencing objects
// to ADD or MOD (DEL possible). See HHH-5845.
return versionsReader.find( entityClass, entityName, entityId, revision, removed );
}
else {
// Not audited relation, look up entity with Hibernate.
return versionsReader.getSessionImplementor().immediateLoad( entityName, entityId );
}
}

/**
Expand All @@ -51,14 +53,15 @@ public static Object createProxy(
Object entityId,
Number revision,
boolean removed,
EnversService enversService) {
EnversService enversService,
boolean isTargetNotAudited) {
final EntityPersister persister = versionsReader.getSessionImplementor()
.getFactory()
.getMappingMetamodel()
.getEntityDescriptor( entityName );
return persister.createProxy(
entityId,
new ToOneDelegateSessionImplementor( versionsReader, entityClass, entityId, revision, removed, enversService )
new ToOneDelegateSessionImplementor( versionsReader, entityClass, entityId, revision, removed, enversService, isTargetNotAudited )
);
}

Expand All @@ -73,14 +76,15 @@ public static Object createProxyOrLoadImmediate(
Object entityId,
Number revision,
boolean removed,
EnversService enversService) {
EnversService enversService,
boolean isTargetNotAudited) {
final EntityPersister persister = versionsReader.getSessionImplementor()
.getFactory()
.getMappingMetamodel()
.getEntityDescriptor( entityName );
if ( persister.hasProxy() ) {
return createProxy( versionsReader, entityClass, entityName, entityId, revision, removed, enversService );
return createProxy( versionsReader, entityClass, entityName, entityId, revision, removed, enversService, isTargetNotAudited );
}
return loadImmediate( versionsReader, entityClass, entityName, entityId, revision, removed, enversService );
return loadImmediate( versionsReader, entityClass, entityName, entityId, revision, removed, enversService, isTargetNotAudited );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,15 @@ public Object nullSafeMapToEntityFromMap(
}
else {
final EntityInfo referencedEntity = getEntityInfo( enversService, referencedEntityName );

// Check if the relation is marked as NOT_AUDITED
final String referencingEntityName = enversService.getEntitiesConfigurations()
.getEntityNameForVersionsEntityName( (String) data.get( "$type$" ) );
final boolean isTargetNotAudited = referencingEntityName != null &&
enversService.getEntitiesConfigurations()
.getRelationDescription( referencingEntityName, getPropertyData().getName() )
.isTargetNotAudited();

if ( isIgnoreNotFound( enversService, referencedEntity, data, primaryKey ) ) {
// Eagerly loading referenced entity to silence potential (in case of proxy)
// EntityNotFoundException or ObjectNotFoundException. Assigning null reference.
Expand All @@ -160,7 +169,8 @@ public Object nullSafeMapToEntityFromMap(
entityId,
revision,
RevisionType.DEL.equals( data.get( enversService.getConfig().getRevisionTypePropertyName() ) ),
enversService
enversService,
isTargetNotAudited
);
}
else {
Expand All @@ -171,7 +181,8 @@ public Object nullSafeMapToEntityFromMap(
entityId,
revision,
RevisionType.DEL.equals( data.get( enversService.getConfig().getRevisionTypePropertyName() ) ),
enversService
enversService,
isTargetNotAudited
);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,24 @@ public class ToOneDelegateSessionImplementor extends AbstractDelegateSessionImpl
private final Number revision;
private final boolean removed;
private final EnversService enversService;
private final boolean isTargetNotAudited;

public ToOneDelegateSessionImplementor(
AuditReaderImplementor versionsReader,
Class<?> entityClass,
Object entityId,
Number revision,
boolean removed,
EnversService enversService) {
EnversService enversService,
boolean isTargetNotAudited) {
super( versionsReader.getSessionImplementor() );
this.versionsReader = versionsReader;
this.entityClass = entityClass;
this.entityId = entityId;
this.revision = revision;
this.removed = removed;
this.enversService = enversService;
this.isTargetNotAudited = isTargetNotAudited;
}

@Override
Expand All @@ -49,7 +52,8 @@ public Object doImmediateLoad(String entityName) throws HibernateException {
entityId,
revision,
removed,
enversService
enversService,
isTargetNotAudited
);
}
}
Loading