org.hibernate.envers.internal.synchronization.work.CollectionChangeWorkUnit 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.work;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.envers.RevisionType;
import org.hibernate.envers.boot.internal.EnversService;
import org.hibernate.envers.internal.entities.EntityConfiguration;
import org.hibernate.envers.internal.entities.mapper.PropertyMapper;
/**
* @author Adam Warski (adam at warski dot org)
* @author Michal Skowronek (mskowr at o2 dot pl)
*/
public class CollectionChangeWorkUnit extends AbstractAuditWorkUnit implements AuditWorkUnit {
private Object entity;
private final String collectionPropertyName;
private final Map data = new HashMap<>();
public CollectionChangeWorkUnit(
SessionImplementor session,
String entityName,
String collectionPropertyName,
EnversService enversService,
Serializable id,
Object entity) {
super( session, entityName, enversService, id, RevisionType.MOD );
this.entity = entity;
this.collectionPropertyName = collectionPropertyName;
}
@Override
public boolean containsWork() {
return true;
}
@Override
public Map generateData(Object revisionData) {
fillDataWithId( data, revisionData );
final Map preGenerateData = new HashMap<>( data );
final EntityConfiguration entityConfig = enversService.getEntitiesConfigurations().get( getEntityName() );
final PropertyMapper propertyMapper = entityConfig.getPropertyMapper();
// HHH-7681 - Use entity as 'oldObj' so fake bidirectional non-insertable fields are tracked properly.
propertyMapper.mapToMapFromEntity( sessionImplementor, data, entity, entity );
propertyMapper.mapModifiedFlagsToMapFromEntity( sessionImplementor, data, entity, entity );
propertyMapper.mapModifiedFlagsToMapForCollectionChange( collectionPropertyName, data );
data.putAll( preGenerateData );
return data;
}
public void mergeCollectionModifiedData(Map data) {
enversService.getEntitiesConfigurations().get( getEntityName() ).getPropertyMapper().mapModifiedFlagsToMapForCollectionChange(
collectionPropertyName,
data
);
}
@Override
public AuditWorkUnit merge(AddWorkUnit second) {
return second;
}
@Override
public AuditWorkUnit merge(ModWorkUnit second) {
mergeCollectionModifiedData( second.getData() );
return second;
}
@Override
public AuditWorkUnit merge(DelWorkUnit second) {
return second;
}
@Override
public AuditWorkUnit merge(CollectionChangeWorkUnit second) {
second.mergeCollectionModifiedData( data );
return this;
}
@Override
public AuditWorkUnit merge(FakeBidirectionalRelationWorkUnit second) {
return second;
}
@Override
public AuditWorkUnit dispatch(WorkUnitMergeVisitor first) {
return first.merge( this );
}
}