use of org.hibernate.envers.internal.entities.mapper.ExtendedPropertyMapper in project hibernate-orm by hibernate.
the class AuditMetadataGenerator method generateFirstPass.
@SuppressWarnings({ "unchecked" })
public void generateFirstPass(PersistentClass pc, ClassAuditingData auditingData, EntityXmlMappingData xmlMappingData, boolean isAudited) {
final String schema = getSchema(auditingData.getAuditTable().schema(), pc.getTable());
final String catalog = getCatalog(auditingData.getAuditTable().catalog(), pc.getTable());
if (!isAudited) {
final String entityName = pc.getEntityName();
final IdMappingData idMapper = idMetadataGenerator.addId(pc, false);
if (idMapper == null) {
// Unsupported id mapping, e.g. key-many-to-one. If the entity is used in auditing, an exception
// will be thrown later on.
LOG.debugf("Unable to create auditing id mapping for entity %s, because of an unsupported Hibernate id mapping (e.g. key-many-to-one)", entityName);
return;
}
final ExtendedPropertyMapper propertyMapper = null;
final String parentEntityName = null;
final EntityConfiguration entityCfg = new EntityConfiguration(entityName, pc.getClassName(), idMapper, propertyMapper, parentEntityName);
notAuditedEntitiesConfigurations.put(entityName, entityCfg);
return;
}
final String entityName = pc.getEntityName();
LOG.debugf("Generating first-pass auditing mapping for entity %s", entityName);
final String auditEntityName = verEntCfg.getAuditEntityName(entityName);
final String auditTableName = verEntCfg.getAuditTableName(entityName, pc.getTable().getName());
// Registering the audit entity name, now that it is known
auditEntityNameRegister.register(auditEntityName);
final AuditTableData auditTableData = new AuditTableData(auditEntityName, auditTableName, schema, catalog);
// Generating a mapping for the id
final IdMappingData idMapper = idMetadataGenerator.addId(pc, true);
final InheritanceType inheritanceType = InheritanceType.get(pc);
// These properties will be read from the mapping data
final Element classMapping;
final ExtendedPropertyMapper propertyMapper;
final String parentEntityName;
final Triple<Element, ExtendedPropertyMapper, String> mappingData;
// Reading the mapping data depending on inheritance type (if any)
switch(inheritanceType) {
case NONE:
mappingData = generateMappingData(pc, xmlMappingData, auditTableData, idMapper);
break;
case SINGLE:
mappingData = generateInheritanceMappingData(pc, xmlMappingData, auditTableData, "subclass");
break;
case JOINED:
mappingData = generateInheritanceMappingData(pc, xmlMappingData, auditTableData, "joined-subclass");
// Adding the "key" element with all id columns...
final Element keyMapping = mappingData.getFirst().addElement("key");
MetadataTools.addColumns(keyMapping, pc.getTable().getPrimaryKey().columnIterator());
// ... and the revision number column, read from the revision info relation mapping.
keyMapping.add((Element) cloneAndSetupRevisionInfoRelationMapping().element("column").clone());
break;
case TABLE_PER_CLASS:
mappingData = generateInheritanceMappingData(pc, xmlMappingData, auditTableData, "union-subclass");
break;
default:
throw new AssertionError("Impossible enum value.");
}
classMapping = mappingData.getFirst();
propertyMapper = mappingData.getSecond();
parentEntityName = mappingData.getThird();
xmlMappingData.setClassMapping(classMapping);
// Mapping unjoined properties
addProperties(classMapping, pc.getUnjoinedPropertyIterator(), propertyMapper, auditingData, pc.getEntityName(), xmlMappingData, true);
// Creating and mapping joins (first pass)
createJoins(pc, classMapping, auditingData);
addJoins(pc, propertyMapper, auditingData, pc.getEntityName(), xmlMappingData, true);
// HHH-7940 - New synthetic property support for @IndexColumn/@OrderColumn dynamic properties
addSynthetics(classMapping, auditingData, propertyMapper, xmlMappingData, pc.getEntityName(), true);
// Storing the generated configuration
final EntityConfiguration entityCfg = new EntityConfiguration(auditEntityName, pc.getClassName(), idMapper, propertyMapper, parentEntityName);
entitiesConfigurations.put(pc.getEntityName(), entityCfg);
}
use of org.hibernate.envers.internal.entities.mapper.ExtendedPropertyMapper in project hibernate-orm by hibernate.
the class AuditMetadataGenerator method generateInheritanceMappingData.
private Triple<Element, ExtendedPropertyMapper, String> generateInheritanceMappingData(PersistentClass pc, EntityXmlMappingData xmlMappingData, AuditTableData auditTableData, String inheritanceMappingType) {
final String extendsEntityName = verEntCfg.getAuditEntityName(pc.getSuperclass().getEntityName());
final Element classMapping = MetadataTools.createSubclassEntity(xmlMappingData.getMainXmlMapping(), inheritanceMappingType, auditTableData, extendsEntityName, pc.getDiscriminatorValue(), pc.isAbstract());
// The id and revision type is already mapped in the parent
// Getting the property mapper of the parent - when mapping properties, they need to be included
final String parentEntityName = pc.getSuperclass().getEntityName();
final EntityConfiguration parentConfiguration = entitiesConfigurations.get(parentEntityName);
if (parentConfiguration == null) {
throw new MappingException("Entity '" + pc.getEntityName() + "' is audited, but its superclass: '" + parentEntityName + "' is not.");
}
final ExtendedPropertyMapper parentPropertyMapper = parentConfiguration.getPropertyMapper();
final ExtendedPropertyMapper propertyMapper = new SubclassPropertyMapper(new MultiPropertyMapper(), parentPropertyMapper);
return Triple.make(classMapping, propertyMapper, parentEntityName);
}
use of org.hibernate.envers.internal.entities.mapper.ExtendedPropertyMapper in project hibernate-orm by hibernate.
the class AuditMetadataGenerator method generateMappingData.
@SuppressWarnings({ "unchecked" })
private Triple<Element, ExtendedPropertyMapper, String> generateMappingData(PersistentClass pc, EntityXmlMappingData xmlMappingData, AuditTableData auditTableData, IdMappingData idMapper) {
final Element classMapping = MetadataTools.createEntity(xmlMappingData.getMainXmlMapping(), auditTableData, pc.getDiscriminatorValue(), pc.isAbstract());
final ExtendedPropertyMapper propertyMapper = new MultiPropertyMapper();
// Checking if there is a discriminator column
if (pc.getDiscriminator() != null) {
final Element discriminatorElement = classMapping.addElement("discriminator");
// Database column or SQL formula allowed to distinguish entity types
MetadataTools.addColumnsOrFormulas(discriminatorElement, pc.getDiscriminator().getColumnIterator());
discriminatorElement.addAttribute("type", pc.getDiscriminator().getType().getName());
}
// Adding the id mapping
classMapping.add((Element) idMapper.getXmlMapping().clone());
// Adding the "revision type" property
addRevisionType(classMapping, classMapping);
return Triple.make(classMapping, propertyMapper, null);
}
Aggregations