org.hibernate.envers.internal.entities.mapper.relation.AbstractOneToOneMapper 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.entities.mapper.relation;
import java.io.Serializable;
import java.util.Map;
import javax.persistence.NoResultException;
import org.hibernate.NonUniqueResultException;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.envers.boot.internal.EnversService;
import org.hibernate.envers.exception.AuditException;
import org.hibernate.envers.internal.entities.PropertyData;
import org.hibernate.envers.internal.reader.AuditReaderImplementor;
import org.hibernate.service.ServiceRegistry;
/**
* Template class for property mappers that manage one-to-one relation.
*
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
*/
public abstract class AbstractOneToOneMapper extends AbstractToOneMapper {
private final String entityName;
private final String referencedEntityName;
protected AbstractOneToOneMapper(
String entityName,
String referencedEntityName,
PropertyData propertyData,
ServiceRegistry serviceRegistry) {
super( serviceRegistry, propertyData );
this.entityName = entityName;
this.referencedEntityName = referencedEntityName;
}
@Override
public void nullSafeMapToEntityFromMap(
EnversService enversService,
Object obj,
Map data,
Object primaryKey,
AuditReaderImplementor versionsReader,
Number revision) {
final EntityInfo referencedEntity = getEntityInfo( enversService, referencedEntityName );
Object value;
try {
value = queryForReferencedEntity( versionsReader, referencedEntity, (Serializable) primaryKey, revision );
}
catch (NoResultException e) {
value = null;
}
catch (NonUniqueResultException e) {
throw new AuditException(
"Many versions results for one-to-one relationship " + entityName +
"." + getPropertyData().getBeanName() + ".", e
);
}
setPropertyValue( obj, value );
}
/**
* @param versionsReader Audit reader.
* @param referencedEntity Referenced entity descriptor.
* @param primaryKey Referenced entity identifier.
* @param revision Revision number.
*
* @return Referenced object or proxy of one-to-one relation.
*/
protected abstract Object queryForReferencedEntity(
AuditReaderImplementor versionsReader, EntityInfo referencedEntity,
Serializable primaryKey, Number revision);
@Override
public void mapModifiedFlagsToMapFromEntity(
SessionImplementor session,
Map data,
Object newObj,
Object oldObj) {
}
@Override
public void mapModifiedFlagsToMapForCollectionChange(String collectionPropertyName, Map data) {
if ( getPropertyData().isUsingModifiedFlag() ) {
data.put(
getPropertyData().getModifiedFlagPropertyName(),
collectionPropertyName.equals( getPropertyData().getName() )
);
}
}
}