Search in sources :

Example 1 with ExtendedPropertyMapper

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);
}
Also used : Element(org.dom4j.Element) EntityConfiguration(org.hibernate.envers.internal.entities.EntityConfiguration) ExtendedPropertyMapper(org.hibernate.envers.internal.entities.mapper.ExtendedPropertyMapper) IdMappingData(org.hibernate.envers.internal.entities.IdMappingData)

Example 2 with ExtendedPropertyMapper

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);
}
Also used : Element(org.dom4j.Element) EntityConfiguration(org.hibernate.envers.internal.entities.EntityConfiguration) SubclassPropertyMapper(org.hibernate.envers.internal.entities.mapper.SubclassPropertyMapper) MultiPropertyMapper(org.hibernate.envers.internal.entities.mapper.MultiPropertyMapper) ExtendedPropertyMapper(org.hibernate.envers.internal.entities.mapper.ExtendedPropertyMapper) MappingException(org.hibernate.MappingException)

Example 3 with ExtendedPropertyMapper

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);
}
Also used : Element(org.dom4j.Element) MultiPropertyMapper(org.hibernate.envers.internal.entities.mapper.MultiPropertyMapper) ExtendedPropertyMapper(org.hibernate.envers.internal.entities.mapper.ExtendedPropertyMapper)

Aggregations

Element (org.dom4j.Element)3 ExtendedPropertyMapper (org.hibernate.envers.internal.entities.mapper.ExtendedPropertyMapper)3 EntityConfiguration (org.hibernate.envers.internal.entities.EntityConfiguration)2 MultiPropertyMapper (org.hibernate.envers.internal.entities.mapper.MultiPropertyMapper)2 MappingException (org.hibernate.MappingException)1 IdMappingData (org.hibernate.envers.internal.entities.IdMappingData)1 SubclassPropertyMapper (org.hibernate.envers.internal.entities.mapper.SubclassPropertyMapper)1