HibernateEntityLogic.java

// license-header java merge-point
//
// Attention: generated code (by MetafacadeLogic.vsl) - do not modify!
//
package org.andromda.cartridges.hibernate.metafacades;

import java.util.Collection;
import java.util.List;
import org.andromda.core.common.Introspector;
import org.andromda.core.metafacade.MetafacadeBase;
import org.andromda.core.metafacade.MetafacadeFactory;
import org.andromda.core.metafacade.ModelValidationMessage;
import org.andromda.metafacades.uml.AssociationEndFacade;
import org.andromda.metafacades.uml.AttributeFacade;
import org.andromda.metafacades.uml.ClassifierFacade;
import org.andromda.metafacades.uml.ConstraintFacade;
import org.andromda.metafacades.uml.DependencyFacade;
import org.andromda.metafacades.uml.Entity;
import org.andromda.metafacades.uml.EntityAssociationEnd;
import org.andromda.metafacades.uml.EntityQueryOperation;
import org.andromda.metafacades.uml.GeneralizableElementFacade;
import org.andromda.metafacades.uml.GeneralizationFacade;
import org.andromda.metafacades.uml.ModelElementFacade;
import org.andromda.metafacades.uml.ModelFacade;
import org.andromda.metafacades.uml.OperationFacade;
import org.andromda.metafacades.uml.PackageFacade;
import org.andromda.metafacades.uml.StateMachineFacade;
import org.andromda.metafacades.uml.StereotypeFacade;
import org.andromda.metafacades.uml.TaggedValueFacade;
import org.andromda.metafacades.uml.TemplateParameterFacade;
import org.andromda.metafacades.uml.TypeMappings;
import org.andromda.translation.ocl.validation.OCLCollections;
import org.andromda.translation.ocl.validation.OCLExpressions;
import org.andromda.translation.ocl.validation.OCLIntrospector;
import org.andromda.translation.ocl.validation.OCLResultEnsurer;
import org.apache.commons.collections.Predicate;
import org.apache.log4j.Logger;

/**
 * Represents an hibernate persistent entity.
 * MetafacadeLogic for HibernateEntity
 *
 * @see HibernateEntity
 */
public abstract class HibernateEntityLogic
    extends MetafacadeBase
    implements HibernateEntity
{
    /**
     * The underlying UML object
     * @see Object
     */
    protected Object metaObject;

    /** Create Metafacade implementation instance using the MetafacadeFactory from the context
     * @param metaObjectIn
     * @param context
     */
    protected HibernateEntityLogic(Object metaObjectIn, String context)
    {
        super(metaObjectIn, getContext(context));
        this.superEntity =
           (Entity)
            MetafacadeFactory.getInstance().createFacadeImpl(
                    "org.andromda.metafacades.uml.Entity",
                    metaObjectIn,
                    getContext(context));
        this.metaObject = metaObjectIn;
    }

    /**
     * The logger instance.
     */
    private static final Logger logger = Logger.getLogger(HibernateEntityLogic.class);

    /**
     * Gets the context for this metafacade logic instance.
     * @param context String. Set to HibernateEntity if null
     * @return context String
     */
    private static String getContext(String context)
    {
        if (context == null)
        {
            context = "org.andromda.cartridges.hibernate.metafacades.HibernateEntity";
        }
        return context;
    }

    private Entity superEntity;
    private boolean superEntityInitialized = false;

    /**
     * Gets the Entity parent instance.
     * @return this.superEntity Entity
     */
    private Entity getSuperEntity()
    {
        if (!this.superEntityInitialized)
        {
            ((MetafacadeBase)this.superEntity).setMetafacadeContext(this.getMetafacadeContext());
            this.superEntityInitialized = true;
        }
        return this.superEntity;
    }

    /** Reset context only for non-root metafacades
     * @param context
     * @see MetafacadeBase#resetMetafacadeContext(String context)
     */
    @Override
    public void resetMetafacadeContext(String context)
    {
        if (!this.contextRoot) // reset context only for non-root metafacades
        {
            context = getContext(context);  // to have same value as in original constructor call
            setMetafacadeContext (context);
            if (this.superEntityInitialized)
            {
                ((MetafacadeBase)this.superEntity).resetMetafacadeContext(context);
            }
        }
    }

    /**
     * @return boolean true always
     * @see HibernateEntity
     */
    public boolean isHibernateEntityMetaType()
    {
        return true;
    }

    // --------------- attributes ---------------------

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isHibernateInheritanceClass()
    * @return boolean
    */
    protected abstract boolean handleIsHibernateInheritanceClass();

    private boolean __hibernateInheritanceClass1a;
    private boolean __hibernateInheritanceClass1aSet = false;

    /**
     * Return true if the hibernate inheritance strategy as specified by the tagged value
     * andromda_inheritance_strategy is defined as class.
     * @return (boolean)handleIsHibernateInheritanceClass()
     */
    public final boolean isHibernateInheritanceClass()
    {
        boolean hibernateInheritanceClass1a = this.__hibernateInheritanceClass1a;
        if (!this.__hibernateInheritanceClass1aSet)
        {
            // hibernateInheritanceClass has no pre constraints
            hibernateInheritanceClass1a = handleIsHibernateInheritanceClass();
            // hibernateInheritanceClass has no post constraints
            this.__hibernateInheritanceClass1a = hibernateInheritanceClass1a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateInheritanceClass1aSet = true;
            }
        }
        return hibernateInheritanceClass1a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isHibernateInheritanceConcrete()
    * @return boolean
    */
    protected abstract boolean handleIsHibernateInheritanceConcrete();

    private boolean __hibernateInheritanceConcrete2a;
    private boolean __hibernateInheritanceConcrete2aSet = false;

    /**
     * Return true if the hibernate inheritance strategy as specified by the tagged value
     * andromda_inheritance_strategy is defined as concrete.
     * @return (boolean)handleIsHibernateInheritanceConcrete()
     */
    public final boolean isHibernateInheritanceConcrete()
    {
        boolean hibernateInheritanceConcrete2a = this.__hibernateInheritanceConcrete2a;
        if (!this.__hibernateInheritanceConcrete2aSet)
        {
            // hibernateInheritanceConcrete has no pre constraints
            hibernateInheritanceConcrete2a = handleIsHibernateInheritanceConcrete();
            // hibernateInheritanceConcrete has no post constraints
            this.__hibernateInheritanceConcrete2a = hibernateInheritanceConcrete2a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateInheritanceConcrete2aSet = true;
            }
        }
        return hibernateInheritanceConcrete2a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isHibernateInheritanceSubclass()
    * @return boolean
    */
    protected abstract boolean handleIsHibernateInheritanceSubclass();

    private boolean __hibernateInheritanceSubclass3a;
    private boolean __hibernateInheritanceSubclass3aSet = false;

    /**
     * Return true if the hibernate inheritance strategy as specified by the tagged value
     * andromda_inheritance_strategy is defined as subclass.
     * @return (boolean)handleIsHibernateInheritanceSubclass()
     */
    public final boolean isHibernateInheritanceSubclass()
    {
        boolean hibernateInheritanceSubclass3a = this.__hibernateInheritanceSubclass3a;
        if (!this.__hibernateInheritanceSubclass3aSet)
        {
            // hibernateInheritanceSubclass has no pre constraints
            hibernateInheritanceSubclass3a = handleIsHibernateInheritanceSubclass();
            // hibernateInheritanceSubclass has no post constraints
            this.__hibernateInheritanceSubclass3a = hibernateInheritanceSubclass3a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateInheritanceSubclass3aSet = true;
            }
        }
        return hibernateInheritanceSubclass3a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isHibernateInheritanceInterface()
    * @return boolean
    */
    protected abstract boolean handleIsHibernateInheritanceInterface();

    private boolean __hibernateInheritanceInterface4a;
    private boolean __hibernateInheritanceInterface4aSet = false;

    /**
     * Return true if the hibernate inheritance strategy as specified by the tagged value
     * andromda_inheritance_strategy is defined as interface.
     * @return (boolean)handleIsHibernateInheritanceInterface()
     */
    public final boolean isHibernateInheritanceInterface()
    {
        boolean hibernateInheritanceInterface4a = this.__hibernateInheritanceInterface4a;
        if (!this.__hibernateInheritanceInterface4aSet)
        {
            // hibernateInheritanceInterface has no pre constraints
            hibernateInheritanceInterface4a = handleIsHibernateInheritanceInterface();
            // hibernateInheritanceInterface has no post constraints
            this.__hibernateInheritanceInterface4a = hibernateInheritanceInterface4a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateInheritanceInterface4aSet = true;
            }
        }
        return hibernateInheritanceInterface4a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getHibernateInheritanceStrategy()
    * @return String
    */
    protected abstract String handleGetHibernateInheritanceStrategy();

    private String __hibernateInheritanceStrategy5a;
    private boolean __hibernateInheritanceStrategy5aSet = false;

    /**
     * Return the value of andromda.hibernate.inheritance tagged value.
     * @return (String)handleGetHibernateInheritanceStrategy()
     */
    public final String getHibernateInheritanceStrategy()
    {
        String hibernateInheritanceStrategy5a = this.__hibernateInheritanceStrategy5a;
        if (!this.__hibernateInheritanceStrategy5aSet)
        {
            // hibernateInheritanceStrategy has no pre constraints
            hibernateInheritanceStrategy5a = handleGetHibernateInheritanceStrategy();
            // hibernateInheritanceStrategy has no post constraints
            this.__hibernateInheritanceStrategy5a = hibernateInheritanceStrategy5a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateInheritanceStrategy5aSet = true;
            }
        }
        return hibernateInheritanceStrategy5a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getHibernateCacheType()
    * @return String
    */
    protected abstract String handleGetHibernateCacheType();

    private String __hibernateCacheType6a;
    private boolean __hibernateCacheType6aSet = false;

    /**
     * Cache policy for the entity. Posible values are read-write, nonstrict-read-write, read-only
     * @return (String)handleGetHibernateCacheType()
     */
    public final String getHibernateCacheType()
    {
        String hibernateCacheType6a = this.__hibernateCacheType6a;
        if (!this.__hibernateCacheType6aSet)
        {
            // hibernateCacheType has no pre constraints
            hibernateCacheType6a = handleGetHibernateCacheType();
            // hibernateCacheType has no post constraints
            this.__hibernateCacheType6a = hibernateCacheType6a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateCacheType6aSet = true;
            }
        }
        return hibernateCacheType6a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getFullyQualifiedEntityName()
    * @return String
    */
    protected abstract String handleGetFullyQualifiedEntityName();

    private String __fullyQualifiedEntityName7a;
    private boolean __fullyQualifiedEntityName7aSet = false;

    /**
     * TODO: Model Documentation for
     * org.andromda.cartridges.hibernate.metafacades.HibernateEntity.fullyQualifiedEntityName
     * @return (String)handleGetFullyQualifiedEntityName()
     */
    public final String getFullyQualifiedEntityName()
    {
        String fullyQualifiedEntityName7a = this.__fullyQualifiedEntityName7a;
        if (!this.__fullyQualifiedEntityName7aSet)
        {
            // fullyQualifiedEntityName has no pre constraints
            fullyQualifiedEntityName7a = handleGetFullyQualifiedEntityName();
            // fullyQualifiedEntityName has no post constraints
            this.__fullyQualifiedEntityName7a = fullyQualifiedEntityName7a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__fullyQualifiedEntityName7aSet = true;
            }
        }
        return fullyQualifiedEntityName7a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getFullyQualifiedEntityImplementationName()
    * @return String
    */
    protected abstract String handleGetFullyQualifiedEntityImplementationName();

    private String __fullyQualifiedEntityImplementationName8a;
    private boolean __fullyQualifiedEntityImplementationName8aSet = false;

    /**
     * TODO: Model Documentation for
     * org.andromda.cartridges.hibernate.metafacades.HibernateEntity.fullyQualifiedEntityImplementationName
     * @return (String)handleGetFullyQualifiedEntityImplementationName()
     */
    public final String getFullyQualifiedEntityImplementationName()
    {
        String fullyQualifiedEntityImplementationName8a = this.__fullyQualifiedEntityImplementationName8a;
        if (!this.__fullyQualifiedEntityImplementationName8aSet)
        {
            // fullyQualifiedEntityImplementationName has no pre constraints
            fullyQualifiedEntityImplementationName8a = handleGetFullyQualifiedEntityImplementationName();
            // fullyQualifiedEntityImplementationName has no post constraints
            this.__fullyQualifiedEntityImplementationName8a = fullyQualifiedEntityImplementationName8a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__fullyQualifiedEntityImplementationName8aSet = true;
            }
        }
        return fullyQualifiedEntityImplementationName8a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getHibernateDefaultCascade()
    * @return String
    */
    protected abstract String handleGetHibernateDefaultCascade();

    private String __hibernateDefaultCascade9a;
    private boolean __hibernateDefaultCascade9aSet = false;

    /**
     * TODO: Model Documentation for
     * org.andromda.cartridges.hibernate.metafacades.HibernateEntity.hibernateDefaultCascade
     * @return (String)handleGetHibernateDefaultCascade()
     */
    public final String getHibernateDefaultCascade()
    {
        String hibernateDefaultCascade9a = this.__hibernateDefaultCascade9a;
        if (!this.__hibernateDefaultCascade9aSet)
        {
            // hibernateDefaultCascade has no pre constraints
            hibernateDefaultCascade9a = handleGetHibernateDefaultCascade();
            // hibernateDefaultCascade has no post constraints
            this.__hibernateDefaultCascade9a = hibernateDefaultCascade9a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateDefaultCascade9aSet = true;
            }
        }
        return hibernateDefaultCascade9a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getHibernateGeneratorClass()
    * @return String
    */
    protected abstract String handleGetHibernateGeneratorClass();

    private String __hibernateGeneratorClass10a;
    private boolean __hibernateGeneratorClass10aSet = false;

    /**
     * TODO: Model Documentation for
     * org.andromda.cartridges.hibernate.metafacades.HibernateEntity.hibernateGeneratorClass
     * @return (String)handleGetHibernateGeneratorClass()
     */
    public final String getHibernateGeneratorClass()
    {
        String hibernateGeneratorClass10a = this.__hibernateGeneratorClass10a;
        if (!this.__hibernateGeneratorClass10aSet)
        {
            // hibernateGeneratorClass has no pre constraints
            hibernateGeneratorClass10a = handleGetHibernateGeneratorClass();
            // hibernateGeneratorClass has no post constraints
            this.__hibernateGeneratorClass10a = hibernateGeneratorClass10a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateGeneratorClass10aSet = true;
            }
        }
        return hibernateGeneratorClass10a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isForeignHibernateGeneratorClass()
    * @return boolean
    */
    protected abstract boolean handleIsForeignHibernateGeneratorClass();

    private boolean __foreignHibernateGeneratorClass11a;
    private boolean __foreignHibernateGeneratorClass11aSet = false;

    /**
     * Indicates whether or not hibernate generator class for this SpringEntity is foreign or not.
     * @return (boolean)handleIsForeignHibernateGeneratorClass()
     */
    public final boolean isForeignHibernateGeneratorClass()
    {
        boolean foreignHibernateGeneratorClass11a = this.__foreignHibernateGeneratorClass11a;
        if (!this.__foreignHibernateGeneratorClass11aSet)
        {
            // foreignHibernateGeneratorClass has no pre constraints
            foreignHibernateGeneratorClass11a = handleIsForeignHibernateGeneratorClass();
            // foreignHibernateGeneratorClass has no post constraints
            this.__foreignHibernateGeneratorClass11a = foreignHibernateGeneratorClass11a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__foreignHibernateGeneratorClass11aSet = true;
            }
        }
        return foreignHibernateGeneratorClass11a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getHibernateDiscriminatorColumn()
    * @return String
    */
    protected abstract String handleGetHibernateDiscriminatorColumn();

    private String __hibernateDiscriminatorColumn12a;
    private boolean __hibernateDiscriminatorColumn12aSet = false;

    /**
     * The name of the discriminator column. Default is class.
     * @return (String)handleGetHibernateDiscriminatorColumn()
     */
    public final String getHibernateDiscriminatorColumn()
    {
        String hibernateDiscriminatorColumn12a = this.__hibernateDiscriminatorColumn12a;
        if (!this.__hibernateDiscriminatorColumn12aSet)
        {
            // hibernateDiscriminatorColumn has no pre constraints
            hibernateDiscriminatorColumn12a = handleGetHibernateDiscriminatorColumn();
            // hibernateDiscriminatorColumn has no post constraints
            this.__hibernateDiscriminatorColumn12a = hibernateDiscriminatorColumn12a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateDiscriminatorColumn12aSet = true;
            }
        }
        return hibernateDiscriminatorColumn12a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getHibernateDiscriminatorType()
    * @return String
    */
    protected abstract String handleGetHibernateDiscriminatorType();

    private String __hibernateDiscriminatorType13a;
    private boolean __hibernateDiscriminatorType13aSet = false;

    /**
     * The type of the hibernate discriminator column. Default is string.
     * @return (String)handleGetHibernateDiscriminatorType()
     */
    public final String getHibernateDiscriminatorType()
    {
        String hibernateDiscriminatorType13a = this.__hibernateDiscriminatorType13a;
        if (!this.__hibernateDiscriminatorType13aSet)
        {
            // hibernateDiscriminatorType has no pre constraints
            hibernateDiscriminatorType13a = handleGetHibernateDiscriminatorType();
            // hibernateDiscriminatorType has no post constraints
            this.__hibernateDiscriminatorType13a = hibernateDiscriminatorType13a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateDiscriminatorType13aSet = true;
            }
        }
        return hibernateDiscriminatorType13a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getHibernateDiscriminatorLength()
    * @return int
    */
    protected abstract int handleGetHibernateDiscriminatorLength();

    private int __hibernateDiscriminatorLength14a;
    private boolean __hibernateDiscriminatorLength14aSet = false;

    /**
     * The standard length of a discriminator value. Default is 1.
     * @return (int)handleGetHibernateDiscriminatorLength()
     */
    public final int getHibernateDiscriminatorLength()
    {
        int hibernateDiscriminatorLength14a = this.__hibernateDiscriminatorLength14a;
        if (!this.__hibernateDiscriminatorLength14aSet)
        {
            // hibernateDiscriminatorLength has no pre constraints
            hibernateDiscriminatorLength14a = handleGetHibernateDiscriminatorLength();
            // hibernateDiscriminatorLength has no post constraints
            this.__hibernateDiscriminatorLength14a = hibernateDiscriminatorLength14a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateDiscriminatorLength14aSet = true;
            }
        }
        return hibernateDiscriminatorLength14a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getEntityName()
    * @return String
    */
    protected abstract String handleGetEntityName();

    private String __entityName15a;
    private boolean __entityName15aSet = false;

    /**
     * The name used for the hibernate entity.
     * @return (String)handleGetEntityName()
     */
    public final String getEntityName()
    {
        String entityName15a = this.__entityName15a;
        if (!this.__entityName15aSet)
        {
            // entityName has no pre constraints
            entityName15a = handleGetEntityName();
            // entityName has no post constraints
            this.__entityName15a = entityName15a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__entityName15aSet = true;
            }
        }
        return entityName15a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getEntityImplementationName()
    * @return String
    */
    protected abstract String handleGetEntityImplementationName();

    private String __entityImplementationName16a;
    private boolean __entityImplementationName16aSet = false;

    /**
     * The name of the implementation class.
     * @return (String)handleGetEntityImplementationName()
     */
    public final String getEntityImplementationName()
    {
        String entityImplementationName16a = this.__entityImplementationName16a;
        if (!this.__entityImplementationName16aSet)
        {
            // entityImplementationName has no pre constraints
            entityImplementationName16a = handleGetEntityImplementationName();
            // entityImplementationName has no post constraints
            this.__entityImplementationName16a = entityImplementationName16a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__entityImplementationName16aSet = true;
            }
        }
        return entityImplementationName16a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isBusinessOperationsPresent()
    * @return boolean
    */
    protected abstract boolean handleIsBusinessOperationsPresent();

    private boolean __businessOperationsPresent17a;
    private boolean __businessOperationsPresent17aSet = false;

    /**
     * Indicates whether or not any entity operations are present.
     * @return (boolean)handleIsBusinessOperationsPresent()
     */
    public final boolean isBusinessOperationsPresent()
    {
        boolean businessOperationsPresent17a = this.__businessOperationsPresent17a;
        if (!this.__businessOperationsPresent17aSet)
        {
            // businessOperationsPresent has no pre constraints
            businessOperationsPresent17a = handleIsBusinessOperationsPresent();
            // businessOperationsPresent has no post constraints
            this.__businessOperationsPresent17a = businessOperationsPresent17a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__businessOperationsPresent17aSet = true;
            }
        }
        return businessOperationsPresent17a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isHibernateProxy()
    * @return boolean
    */
    protected abstract boolean handleIsHibernateProxy();

    private boolean __hibernateProxy18a;
    private boolean __hibernateProxy18aSet = false;

    /**
     * TODO: Model Documentation for
     * org.andromda.cartridges.hibernate.metafacades.HibernateEntity.hibernateProxy
     * @return (boolean)handleIsHibernateProxy()
     */
    public final boolean isHibernateProxy()
    {
        boolean hibernateProxy18a = this.__hibernateProxy18a;
        if (!this.__hibernateProxy18aSet)
        {
            // hibernateProxy has no pre constraints
            hibernateProxy18a = handleIsHibernateProxy();
            // hibernateProxy has no post constraints
            this.__hibernateProxy18a = hibernateProxy18a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateProxy18aSet = true;
            }
        }
        return hibernateProxy18a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getEhCacheMaxElementsInMemory()
    * @return int
    */
    protected abstract int handleGetEhCacheMaxElementsInMemory();

    private int __ehCacheMaxElementsInMemory19a;
    private boolean __ehCacheMaxElementsInMemory19aSet = false;

    /**
     * EhCache property. Defines the maximum number of objects that will be created in memory.
     * @return (int)handleGetEhCacheMaxElementsInMemory()
     */
    public final int getEhCacheMaxElementsInMemory()
    {
        int ehCacheMaxElementsInMemory19a = this.__ehCacheMaxElementsInMemory19a;
        if (!this.__ehCacheMaxElementsInMemory19aSet)
        {
            // ehCacheMaxElementsInMemory has no pre constraints
            ehCacheMaxElementsInMemory19a = handleGetEhCacheMaxElementsInMemory();
            // ehCacheMaxElementsInMemory has no post constraints
            this.__ehCacheMaxElementsInMemory19a = ehCacheMaxElementsInMemory19a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__ehCacheMaxElementsInMemory19aSet = true;
            }
        }
        return ehCacheMaxElementsInMemory19a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isEhCacheEternal()
    * @return boolean
    */
    protected abstract boolean handleIsEhCacheEternal();

    private boolean __ehCacheEternal20a;
    private boolean __ehCacheEternal20aSet = false;

    /**
     * EhCache property. Defines if elements are eternal.
     * @return (boolean)handleIsEhCacheEternal()
     */
    public final boolean isEhCacheEternal()
    {
        boolean ehCacheEternal20a = this.__ehCacheEternal20a;
        if (!this.__ehCacheEternal20aSet)
        {
            // ehCacheEternal has no pre constraints
            ehCacheEternal20a = handleIsEhCacheEternal();
            // ehCacheEternal has no post constraints
            this.__ehCacheEternal20a = ehCacheEternal20a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__ehCacheEternal20aSet = true;
            }
        }
        return ehCacheEternal20a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getEhCacheTimeToIdleSeconds()
    * @return int
    */
    protected abstract int handleGetEhCacheTimeToIdleSeconds();

    private int __ehCacheTimeToIdleSeconds21a;
    private boolean __ehCacheTimeToIdleSeconds21aSet = false;

    /**
     * EhCache property. Defines the time to idle for an element before it expires.
     * @return (int)handleGetEhCacheTimeToIdleSeconds()
     */
    public final int getEhCacheTimeToIdleSeconds()
    {
        int ehCacheTimeToIdleSeconds21a = this.__ehCacheTimeToIdleSeconds21a;
        if (!this.__ehCacheTimeToIdleSeconds21aSet)
        {
            // ehCacheTimeToIdleSeconds has no pre constraints
            ehCacheTimeToIdleSeconds21a = handleGetEhCacheTimeToIdleSeconds();
            // ehCacheTimeToIdleSeconds has no post constraints
            this.__ehCacheTimeToIdleSeconds21a = ehCacheTimeToIdleSeconds21a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__ehCacheTimeToIdleSeconds21aSet = true;
            }
        }
        return ehCacheTimeToIdleSeconds21a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getEhCacheTimeToLiveSeconds()
    * @return int
    */
    protected abstract int handleGetEhCacheTimeToLiveSeconds();

    private int __ehCacheTimeToLiveSeconds22a;
    private boolean __ehCacheTimeToLiveSeconds22aSet = false;

    /**
     * EhCache property. Defines the time to live for an element before it expires.
     * @return (int)handleGetEhCacheTimeToLiveSeconds()
     */
    public final int getEhCacheTimeToLiveSeconds()
    {
        int ehCacheTimeToLiveSeconds22a = this.__ehCacheTimeToLiveSeconds22a;
        if (!this.__ehCacheTimeToLiveSeconds22aSet)
        {
            // ehCacheTimeToLiveSeconds has no pre constraints
            ehCacheTimeToLiveSeconds22a = handleGetEhCacheTimeToLiveSeconds();
            // ehCacheTimeToLiveSeconds has no post constraints
            this.__ehCacheTimeToLiveSeconds22a = ehCacheTimeToLiveSeconds22a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__ehCacheTimeToLiveSeconds22aSet = true;
            }
        }
        return ehCacheTimeToLiveSeconds22a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isEhCacheOverflowToDisk()
    * @return boolean
    */
    protected abstract boolean handleIsEhCacheOverflowToDisk();

    private boolean __ehCacheOverflowToDisk23a;
    private boolean __ehCacheOverflowToDisk23aSet = false;

    /**
     * EhCache property. Defines if elements can overflow to disk
     * @return (boolean)handleIsEhCacheOverflowToDisk()
     */
    public final boolean isEhCacheOverflowToDisk()
    {
        boolean ehCacheOverflowToDisk23a = this.__ehCacheOverflowToDisk23a;
        if (!this.__ehCacheOverflowToDisk23aSet)
        {
            // ehCacheOverflowToDisk has no pre constraints
            ehCacheOverflowToDisk23a = handleIsEhCacheOverflowToDisk();
            // ehCacheOverflowToDisk has no post constraints
            this.__ehCacheOverflowToDisk23a = ehCacheOverflowToDisk23a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__ehCacheOverflowToDisk23aSet = true;
            }
        }
        return ehCacheOverflowToDisk23a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isSequenceHibernateGeneratorClass()
    * @return boolean
    */
    protected abstract boolean handleIsSequenceHibernateGeneratorClass();

    private boolean __sequenceHibernateGeneratorClass24a;
    private boolean __sequenceHibernateGeneratorClass24aSet = false;

    /**
     * Indicates whether or not the hibernate generator class is specified as "sequence".
     * @return (boolean)handleIsSequenceHibernateGeneratorClass()
     */
    public final boolean isSequenceHibernateGeneratorClass()
    {
        boolean sequenceHibernateGeneratorClass24a = this.__sequenceHibernateGeneratorClass24a;
        if (!this.__sequenceHibernateGeneratorClass24aSet)
        {
            // sequenceHibernateGeneratorClass has no pre constraints
            sequenceHibernateGeneratorClass24a = handleIsSequenceHibernateGeneratorClass();
            // sequenceHibernateGeneratorClass has no post constraints
            this.__sequenceHibernateGeneratorClass24a = sequenceHibernateGeneratorClass24a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__sequenceHibernateGeneratorClass24aSet = true;
            }
        }
        return sequenceHibernateGeneratorClass24a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isTableRequired()
    * @return boolean
    */
    protected abstract boolean handleIsTableRequired();

    private boolean __tableRequired25a;
    private boolean __tableRequired25aSet = false;

    /**
     * Indicates if a table is required for this entity (sometimes it will not be depending on the
     * inheritance strategy used).
     * @return (boolean)handleIsTableRequired()
     */
    public final boolean isTableRequired()
    {
        boolean tableRequired25a = this.__tableRequired25a;
        if (!this.__tableRequired25aSet)
        {
            // tableRequired has no pre constraints
            tableRequired25a = handleIsTableRequired();
            // tableRequired has no post constraints
            this.__tableRequired25a = tableRequired25a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__tableRequired25aSet = true;
            }
        }
        return tableRequired25a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getMappingClassName()
    * @return String
    */
    protected abstract String handleGetMappingClassName();

    private String __mappingClassName26a;
    private boolean __mappingClassName26aSet = false;

    /**
     * Returns the mapping class name to use (this is will be 'class', 'subclass', etc) depending on
     * whether the entity is a specialization and what type of inheritance strategy is employed.
     * @return (String)handleGetMappingClassName()
     */
    public final String getMappingClassName()
    {
        String mappingClassName26a = this.__mappingClassName26a;
        if (!this.__mappingClassName26aSet)
        {
            // mappingClassName has no pre constraints
            mappingClassName26a = handleGetMappingClassName();
            // mappingClassName has no post constraints
            this.__mappingClassName26a = mappingClassName26a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__mappingClassName26aSet = true;
            }
        }
        return mappingClassName26a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getSubclassKeyColumn()
    * @return String
    */
    protected abstract String handleGetSubclassKeyColumn();

    private String __subclassKeyColumn27a;
    private boolean __subclassKeyColumn27aSet = false;

    /**
     * Gets the name of the key column if the inheritance strategy is "subclass".  If the strategy
     * is not "subclass" this returns null.
     * @return (String)handleGetSubclassKeyColumn()
     */
    public final String getSubclassKeyColumn()
    {
        String subclassKeyColumn27a = this.__subclassKeyColumn27a;
        if (!this.__subclassKeyColumn27aSet)
        {
            // subclassKeyColumn has no pre constraints
            subclassKeyColumn27a = handleGetSubclassKeyColumn();
            // subclassKeyColumn has no post constraints
            this.__subclassKeyColumn27a = subclassKeyColumn27a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__subclassKeyColumn27aSet = true;
            }
        }
        return subclassKeyColumn27a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isRequiresMapping()
    * @return boolean
    */
    protected abstract boolean handleIsRequiresMapping();

    private boolean __requiresMapping28a;
    private boolean __requiresMapping28aSet = false;

    /**
     * Indicates if this entity requires a mapping of its own.
     * @return (boolean)handleIsRequiresMapping()
     */
    public final boolean isRequiresMapping()
    {
        boolean requiresMapping28a = this.__requiresMapping28a;
        if (!this.__requiresMapping28aSet)
        {
            // requiresMapping has no pre constraints
            requiresMapping28a = handleIsRequiresMapping();
            // requiresMapping has no post constraints
            this.__requiresMapping28a = requiresMapping28a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__requiresMapping28aSet = true;
            }
        }
        return requiresMapping28a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isRequiresSpecializationMapping()
    * @return boolean
    */
    protected abstract boolean handleIsRequiresSpecializationMapping();

    private boolean __requiresSpecializationMapping29a;
    private boolean __requiresSpecializationMapping29aSet = false;

    /**
     * Indicates if the entity requires specialization mappng.  This happens when the inheritance
     * strategy is "subclass", or "class".
     * @return (boolean)handleIsRequiresSpecializationMapping()
     */
    public final boolean isRequiresSpecializationMapping()
    {
        boolean requiresSpecializationMapping29a = this.__requiresSpecializationMapping29a;
        if (!this.__requiresSpecializationMapping29aSet)
        {
            // requiresSpecializationMapping has no pre constraints
            requiresSpecializationMapping29a = handleIsRequiresSpecializationMapping();
            // requiresSpecializationMapping has no post constraints
            this.__requiresSpecializationMapping29a = requiresSpecializationMapping29a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__requiresSpecializationMapping29aSet = true;
            }
        }
        return requiresSpecializationMapping29a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isDynamicInsert()
    * @return boolean
    */
    protected abstract boolean handleIsDynamicInsert();

    private boolean __dynamicInsert30a;
    private boolean __dynamicInsert30aSet = false;

    /**
     * Specifies if hibernate dynamic-insert will be enabled / disabled for this entity
     * @return (boolean)handleIsDynamicInsert()
     */
    public final boolean isDynamicInsert()
    {
        boolean dynamicInsert30a = this.__dynamicInsert30a;
        if (!this.__dynamicInsert30aSet)
        {
            // dynamicInsert has no pre constraints
            dynamicInsert30a = handleIsDynamicInsert();
            // dynamicInsert has no post constraints
            this.__dynamicInsert30a = dynamicInsert30a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__dynamicInsert30aSet = true;
            }
        }
        return dynamicInsert30a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isDynamicUpdate()
    * @return boolean
    */
    protected abstract boolean handleIsDynamicUpdate();

    private boolean __dynamicUpdate31a;
    private boolean __dynamicUpdate31aSet = false;

    /**
     * Specifies if hibernate dynamic-update will be enabled / disabled for this entity
     * @return (boolean)handleIsDynamicUpdate()
     */
    public final boolean isDynamicUpdate()
    {
        boolean dynamicUpdate31a = this.__dynamicUpdate31a;
        if (!this.__dynamicUpdate31aSet)
        {
            // dynamicUpdate has no pre constraints
            dynamicUpdate31a = handleIsDynamicUpdate();
            // dynamicUpdate has no post constraints
            this.__dynamicUpdate31a = dynamicUpdate31a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__dynamicUpdate31aSet = true;
            }
        }
        return dynamicUpdate31a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isMappingRequiresSuperProperties()
    * @return boolean
    */
    protected abstract boolean handleIsMappingRequiresSuperProperties();

    private boolean __mappingRequiresSuperProperties32a;
    private boolean __mappingRequiresSuperProperties32aSet = false;

    /**
     * Indicates whether or not the mapping for the the entity requires the properties of the super
     * entity to be included within the mapping.  If this evalutes to true, then the properties of
     * this entity would be rendered into the specialization's mapping file.
     * @return (boolean)handleIsMappingRequiresSuperProperties()
     */
    public final boolean isMappingRequiresSuperProperties()
    {
        boolean mappingRequiresSuperProperties32a = this.__mappingRequiresSuperProperties32a;
        if (!this.__mappingRequiresSuperProperties32aSet)
        {
            // mappingRequiresSuperProperties has no pre constraints
            mappingRequiresSuperProperties32a = handleIsMappingRequiresSuperProperties();
            // mappingRequiresSuperProperties has no post constraints
            this.__mappingRequiresSuperProperties32a = mappingRequiresSuperProperties32a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__mappingRequiresSuperProperties32aSet = true;
            }
        }
        return mappingRequiresSuperProperties32a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getHibernateVersionProperty()
    * @return String
    */
    protected abstract String handleGetHibernateVersionProperty();

    private String __hibernateVersionProperty33a;
    private boolean __hibernateVersionProperty33aSet = false;

    /**
     * Stores the value of the Hibernate version property.
     * @return (String)handleGetHibernateVersionProperty()
     */
    public final String getHibernateVersionProperty()
    {
        String hibernateVersionProperty33a = this.__hibernateVersionProperty33a;
        if (!this.__hibernateVersionProperty33aSet)
        {
            // hibernateVersionProperty has no pre constraints
            hibernateVersionProperty33a = handleGetHibernateVersionProperty();
            // hibernateVersionProperty has no post constraints
            this.__hibernateVersionProperty33a = hibernateVersionProperty33a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateVersionProperty33aSet = true;
            }
        }
        return hibernateVersionProperty33a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isHibernateInheritanceUnionSubClass()
    * @return boolean
    */
    protected abstract boolean handleIsHibernateInheritanceUnionSubClass();

    private boolean __hibernateInheritanceUnionSubClass34a;
    private boolean __hibernateInheritanceUnionSubClass34aSet = false;

    /**
     * TODO: Model Documentation for
     * org.andromda.cartridges.hibernate.metafacades.HibernateEntity.hibernateInheritanceUnionSubClass
     * @return (boolean)handleIsHibernateInheritanceUnionSubClass()
     */
    public final boolean isHibernateInheritanceUnionSubClass()
    {
        boolean hibernateInheritanceUnionSubClass34a = this.__hibernateInheritanceUnionSubClass34a;
        if (!this.__hibernateInheritanceUnionSubClass34aSet)
        {
            // hibernateInheritanceUnionSubClass has no pre constraints
            hibernateInheritanceUnionSubClass34a = handleIsHibernateInheritanceUnionSubClass();
            // hibernateInheritanceUnionSubClass has no post constraints
            this.__hibernateInheritanceUnionSubClass34a = hibernateInheritanceUnionSubClass34a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateInheritanceUnionSubClass34aSet = true;
            }
        }
        return hibernateInheritanceUnionSubClass34a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isLazy()
    * @return boolean
    */
    protected abstract boolean handleIsLazy();

    private boolean __lazy35a;
    private boolean __lazy35aSet = false;

    /**
     * Specifies whether the entity should be loaded lazily.
     * @return (boolean)handleIsLazy()
     */
    public final boolean isLazy()
    {
        boolean lazy35a = this.__lazy35a;
        if (!this.__lazy35aSet)
        {
            // lazy has no pre constraints
            lazy35a = handleIsLazy();
            // lazy has no post constraints
            this.__lazy35a = lazy35a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__lazy35aSet = true;
            }
        }
        return lazy35a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getXmlTagName()
    * @return String
    */
    protected abstract String handleGetXmlTagName();

    private String __xmlTagName36a;
    private boolean __xmlTagName36aSet = false;

    /**
     * TODO: Model Documentation for
     * org.andromda.cartridges.hibernate.metafacades.HibernateEntity.xmlTagName
     * @return (String)handleGetXmlTagName()
     */
    public final String getXmlTagName()
    {
        String xmlTagName36a = this.__xmlTagName36a;
        if (!this.__xmlTagName36aSet)
        {
            // xmlTagName has no pre constraints
            xmlTagName36a = handleGetXmlTagName();
            // xmlTagName has no post constraints
            this.__xmlTagName36a = xmlTagName36a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__xmlTagName36aSet = true;
            }
        }
        return xmlTagName36a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getVersion()
    * @return int
    */
    protected abstract int handleGetVersion();

    private int __version37a;
    private boolean __version37aSet = false;

    /**
     * TODO: Model Documentation for
     * org.andromda.cartridges.hibernate.metafacades.HibernateEntity.version
     * @return (int)handleGetVersion()
     */
    public final int getVersion()
    {
        int version37a = this.__version37a;
        if (!this.__version37aSet)
        {
            // version has no pre constraints
            version37a = handleGetVersion();
            // version has no post constraints
            this.__version37a = version37a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__version37aSet = true;
            }
        }
        return version37a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#isHibernateCacheDistributed()
    * @return boolean
    */
    protected abstract boolean handleIsHibernateCacheDistributed();

    private boolean __hibernateCacheDistributed38a;
    private boolean __hibernateCacheDistributed38aSet = false;

    /**
     * Specifies whether the cache for this entity is to be distributed.
     * @return (boolean)handleIsHibernateCacheDistributed()
     */
    public final boolean isHibernateCacheDistributed()
    {
        boolean hibernateCacheDistributed38a = this.__hibernateCacheDistributed38a;
        if (!this.__hibernateCacheDistributed38aSet)
        {
            // hibernateCacheDistributed has no pre constraints
            hibernateCacheDistributed38a = handleIsHibernateCacheDistributed();
            // hibernateCacheDistributed has no post constraints
            this.__hibernateCacheDistributed38a = hibernateCacheDistributed38a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateCacheDistributed38aSet = true;
            }
        }
        return hibernateCacheDistributed38a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getHibernateDiscriminatorValue()
    * @return String
    */
    protected abstract String handleGetHibernateDiscriminatorValue();

    private String __hibernateDiscriminatorValue39a;
    private boolean __hibernateDiscriminatorValue39aSet = false;

    /**
     * The name of the discriminator value. Default is the name of the class
     * @return (String)handleGetHibernateDiscriminatorValue()
     */
    public final String getHibernateDiscriminatorValue()
    {
        String hibernateDiscriminatorValue39a = this.__hibernateDiscriminatorValue39a;
        if (!this.__hibernateDiscriminatorValue39aSet)
        {
            // hibernateDiscriminatorValue has no pre constraints
            hibernateDiscriminatorValue39a = handleGetHibernateDiscriminatorValue();
            // hibernateDiscriminatorValue has no post constraints
            this.__hibernateDiscriminatorValue39a = hibernateDiscriminatorValue39a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateDiscriminatorValue39aSet = true;
            }
        }
        return hibernateDiscriminatorValue39a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getHibernateVersionPropertySqlName()
    * @return String
    */
    protected abstract String handleGetHibernateVersionPropertySqlName();

    private String __hibernateVersionPropertySqlName40a;
    private boolean __hibernateVersionPropertySqlName40aSet = false;

    /**
     * The SQL name of the hibernate version property.
     * @return (String)handleGetHibernateVersionPropertySqlName()
     */
    public final String getHibernateVersionPropertySqlName()
    {
        String hibernateVersionPropertySqlName40a = this.__hibernateVersionPropertySqlName40a;
        if (!this.__hibernateVersionPropertySqlName40aSet)
        {
            // hibernateVersionPropertySqlName has no pre constraints
            hibernateVersionPropertySqlName40a = handleGetHibernateVersionPropertySqlName();
            // hibernateVersionPropertySqlName has no post constraints
            this.__hibernateVersionPropertySqlName40a = hibernateVersionPropertySqlName40a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateVersionPropertySqlName40aSet = true;
            }
        }
        return hibernateVersionPropertySqlName40a;
    }

   /**
    * @see org.andromda.cartridges.hibernate.metafacades.HibernateEntity#getSequenceName()
    * @return String
    */
    protected abstract String handleGetSequenceName();

    private String __sequenceName41a;
    private boolean __sequenceName41aSet = false;

    /**
     * Gets the sequence name.
     * @return (String)handleGetSequenceName()
     */
    public final String getSequenceName()
    {
        String sequenceName41a = this.__sequenceName41a;
        if (!this.__sequenceName41aSet)
        {
            // sequenceName has no pre constraints
            sequenceName41a = handleGetSequenceName();
            // sequenceName has no post constraints
            this.__sequenceName41a = sequenceName41a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__sequenceName41aSet = true;
            }
        }
        return sequenceName41a;
    }

    // ---------------- business methods ----------------------

    /**
     * Method to be implemented in descendants
     * Return all the user defined operations for this entity. Used when leafImpl is true.
     * @return Collection
     */
    protected abstract Collection handleGetAllBusinessOperations();

    /**
     * Return all the user defined operations for this entity. Used when leafImpl is true.
     * @return handleGetAllBusinessOperations()
     */
    public Collection getAllBusinessOperations()
    {
        // getAllBusinessOperations has no pre constraints
        Collection returnValue = handleGetAllBusinessOperations();
        // getAllBusinessOperations has no post constraints
        return returnValue;
    }

    /**
     * @return true
     * @see Entity
     */
    public boolean isEntityMetaType()
    {
        return true;
    }

    /**
     * @return true
     * @see ClassifierFacade
     */
    public boolean isClassifierFacadeMetaType()
    {
        return true;
    }

    /**
     * @return true
     * @see GeneralizableElementFacade
     */
    public boolean isGeneralizableElementFacadeMetaType()
    {
        return true;
    }

    /**
     * @return true
     * @see ModelElementFacade
     */
    public boolean isModelElementFacadeMetaType()
    {
        return true;
    }

    // ----------- delegates to Entity ------------
    /**
     * Return the attribute which name matches the parameter
     * @see ClassifierFacade#findAttribute(String name)
     */
    public AttributeFacade findAttribute(String name)
    {
        return this.getSuperEntity().findAttribute(name);
    }

    /**
     * Those abstraction dependencies for which this classifier is the client.
     * @see ClassifierFacade#getAbstractions()
     */
    public Collection<ClassifierFacade> getAbstractions()
    {
        return this.getSuperEntity().getAbstractions();
    }

    /**
     * Lists all classes associated to this one and any ancestor classes (through generalization).
     * There will be no duplicates. The order of the elements is predictable.
     * @see ClassifierFacade#getAllAssociatedClasses()
     */
    public Collection<ClassifierFacade> getAllAssociatedClasses()
    {
        return this.getSuperEntity().getAllAssociatedClasses();
    }

    /**
     * A collection containing all 'properties' of the classifier and its ancestors.  Properties are
     * any attributes and navigable connecting association ends.
     * @see ClassifierFacade#getAllProperties()
     */
    public Collection<ModelElementFacade> getAllProperties()
    {
        return this.getSuperEntity().getAllProperties();
    }

    /**
     * A collection containing all required and/or read-only 'properties' of the classifier and its
     * ancestors. Properties are any attributes and navigable connecting association ends.
     * @see ClassifierFacade#getAllRequiredConstructorParameters()
     */
    public Collection<ModelElementFacade> getAllRequiredConstructorParameters()
    {
        return this.getSuperEntity().getAllRequiredConstructorParameters();
    }

    /**
     * Gets the array type for this classifier.  If this classifier already represents an array, it
     * just returns itself.
     * @see ClassifierFacade#getArray()
     */
    public ClassifierFacade getArray()
    {
        return this.getSuperEntity().getArray();
    }

    /**
     * The name of the classifier as an array.
     * @see ClassifierFacade#getArrayName()
     */
    public String getArrayName()
    {
        return this.getSuperEntity().getArrayName();
    }

    /**
     * Lists the classes associated to this one, there is no repitition of classes. The order of the
     * elements is predictable.
     * @see ClassifierFacade#getAssociatedClasses()
     */
    public Collection<ClassifierFacade> getAssociatedClasses()
    {
        return this.getSuperEntity().getAssociatedClasses();
    }

    /**
     * Gets the association ends belonging to a classifier.
     * @see ClassifierFacade#getAssociationEnds()
     */
    public List<AssociationEndFacade> getAssociationEnds()
    {
        return this.getSuperEntity().getAssociationEnds();
    }

    /**
     * Gets the attributes that belong to the classifier.
     * @see ClassifierFacade#getAttributes()
     */
    public List<AttributeFacade> getAttributes()
    {
        return this.getSuperEntity().getAttributes();
    }

    /**
     * Gets all attributes for the classifier and if 'follow' is true goes up the inheritance
     * hierarchy and gets the attributes from the super classes as well.
     * @see ClassifierFacade#getAttributes(boolean follow)
     */
    public List<AttributeFacade> getAttributes(boolean follow)
    {
        return this.getSuperEntity().getAttributes(follow);
    }

    /**
     * The fully qualified name of the classifier as an array.
     * @see ClassifierFacade#getFullyQualifiedArrayName()
     */
    public String getFullyQualifiedArrayName()
    {
        return this.getSuperEntity().getFullyQualifiedArrayName();
    }

    /**
     * Returns all those operations that could be implemented at this classifier's level. This means
     * the operations owned by this classifier as well as any realized interface's operations
     * (recursively) in case this classifier itself is not already an interface, or generalized when
     * this classifier is an interface.
     * @see ClassifierFacade#getImplementationOperations()
     */
    public Collection<OperationFacade> getImplementationOperations()
    {
        return this.getSuperEntity().getImplementationOperations();
    }

    /**
     * A comma separated list of the fully qualified names of all implemented interfaces.
     * @see ClassifierFacade#getImplementedInterfaceList()
     */
    public String getImplementedInterfaceList()
    {
        return this.getSuperEntity().getImplementedInterfaceList();
    }

    /**
     * Those attributes that are scoped to an instance of this class.
     * @see ClassifierFacade#getInstanceAttributes()
     */
    public Collection<AttributeFacade> getInstanceAttributes()
    {
        return this.getSuperEntity().getInstanceAttributes();
    }

    /**
     * Those operations that are scoped to an instance of this class.
     * @see ClassifierFacade#getInstanceOperations()
     */
    public List<OperationFacade> getInstanceOperations()
    {
        return this.getSuperEntity().getInstanceOperations();
    }

    /**
     * Those interfaces that are abstractions of this classifier, this basically means this
     * classifier realizes them.
     * @see ClassifierFacade#getInterfaceAbstractions()
     */
    public Collection<ClassifierFacade> getInterfaceAbstractions()
    {
        return this.getSuperEntity().getInterfaceAbstractions();
    }

    /**
     * A String representing a new Constructor declaration for this classifier type to be used in a
     * Java environment.
     * @see ClassifierFacade#getJavaNewString()
     */
    public String getJavaNewString()
    {
        return this.getSuperEntity().getJavaNewString();
    }

    /**
     * A String representing the null-value for this classifier type to be used in a Java
     * environment.
     * @see ClassifierFacade#getJavaNullString()
     */
    public String getJavaNullString()
    {
        return this.getSuperEntity().getJavaNullString();
    }

    /**
     * The other ends of this classifier's association ends which are navigable.
     * @see ClassifierFacade#getNavigableConnectingEnds()
     */
    public Collection<AssociationEndFacade> getNavigableConnectingEnds()
    {
        return this.getSuperEntity().getNavigableConnectingEnds();
    }

    /**
     * Get the other ends of this classifier's association ends which are navigable and if 'follow'
     * is true goes up the inheritance hierarchy and gets the super association ends as well.
     * @see ClassifierFacade#getNavigableConnectingEnds(boolean follow)
     */
    public List<AssociationEndFacade> getNavigableConnectingEnds(boolean follow)
    {
        return this.getSuperEntity().getNavigableConnectingEnds(follow);
    }

    /**
     * Assuming that the classifier is an array, this will return the non array type of the
     * classifier from
     * the model.  If the classifier is NOT an array, it will just return itself.
     * @see ClassifierFacade#getNonArray()
     */
    public ClassifierFacade getNonArray()
    {
        return this.getSuperEntity().getNonArray();
    }

    /**
     * The attributes from this classifier in the form of an operation call (this example would be
     * in Java): '(String attributeOne, String attributeTwo).  If there were no attributes on the
     * classifier, the result would be an empty '()'.
     * @see ClassifierFacade#getOperationCallFromAttributes()
     */
    public String getOperationCallFromAttributes()
    {
        return this.getSuperEntity().getOperationCallFromAttributes();
    }

    /**
     * The operations owned by this classifier.
     * @see ClassifierFacade#getOperations()
     */
    public List<OperationFacade> getOperations()
    {
        return this.getSuperEntity().getOperations();
    }

    /**
     * A collection containing all 'properties' of the classifier.  Properties are any attributes
     * and navigable connecting association ends.
     * @see ClassifierFacade#getProperties()
     */
    public List<ModelElementFacade> getProperties()
    {
        return this.getSuperEntity().getProperties();
    }

    /**
     * Gets all properties (attributes and navigable association ends) for the classifier and if
     * 'follow' is true goes up the inheritance hierarchy and gets the properties from the super
     * classes as well.
     * @see ClassifierFacade#getProperties(boolean follow)
     */
    public List getProperties(boolean follow)
    {
        return this.getSuperEntity().getProperties(follow);
    }

    /**
     * A collection containing all required and/or read-only 'properties' of the classifier. 
     * Properties are any attributes and navigable connecting association ends.
     * @see ClassifierFacade#getRequiredConstructorParameters()
     */
    public Collection<ModelElementFacade> getRequiredConstructorParameters()
    {
        return this.getSuperEntity().getRequiredConstructorParameters();
    }

    /**
     * Returns the serial version UID of the underlying model element.
     * @see ClassifierFacade#getSerialVersionUID()
     */
    public long getSerialVersionUID()
    {
        return this.getSuperEntity().getSerialVersionUID();
    }

    /**
     * Those attributes that are scoped to the definition of this class.
     * @see ClassifierFacade#getStaticAttributes()
     */
    public Collection<AttributeFacade> getStaticAttributes()
    {
        return this.getSuperEntity().getStaticAttributes();
    }

    /**
     * Those operations that are scoped to the definition of this class.
     * @see ClassifierFacade#getStaticOperations()
     */
    public List<OperationFacade> getStaticOperations()
    {
        return this.getSuperEntity().getStaticOperations();
    }

    /**
     * This class' superclass, returns the generalization if it is a ClassifierFacade, null
     * otherwise.
     * @see ClassifierFacade#getSuperClass()
     */
    public ClassifierFacade getSuperClass()
    {
        return this.getSuperEntity().getSuperClass();
    }

    /**
     * The wrapper name for this classifier if a mapped type has a defined wrapper class (ie. 'long'
     * maps to 'Long').  If the classifier doesn't have a wrapper defined for it, this method will
     * return a null.  Note that wrapper mappings must be defined for the namespace by defining the
     * 'wrapperMappingsUri', this property must point to the location of the mappings file which
     * maps the primitives to wrapper types.
     * @see ClassifierFacade#getWrapperName()
     */
    public String getWrapperName()
    {
        return this.getSuperEntity().getWrapperName();
    }

    /**
     * Indicates if this classifier is 'abstract'.
     * @see ClassifierFacade#isAbstract()
     */
    public boolean isAbstract()
    {
        return this.getSuperEntity().isAbstract();
    }

    /**
     * True if this classifier represents an array type. False otherwise.
     * @see ClassifierFacade#isArrayType()
     */
    public boolean isArrayType()
    {
        return this.getSuperEntity().isArrayType();
    }

    /**
     * True if the ClassifierFacade is an AssociationClass.
     * @see ClassifierFacade#isAssociationClass()
     */
    public boolean isAssociationClass()
    {
        return this.getSuperEntity().isAssociationClass();
    }

    /**
     * Returns true if this type represents a Blob type.
     * @see ClassifierFacade#isBlobType()
     */
    public boolean isBlobType()
    {
        return this.getSuperEntity().isBlobType();
    }

    /**
     * Indicates if this type represents a boolean type or not.
     * @see ClassifierFacade#isBooleanType()
     */
    public boolean isBooleanType()
    {
        return this.getSuperEntity().isBooleanType();
    }

    /**
     * Indicates if this type represents a char, Character, or java.lang.Character type or not.
     * @see ClassifierFacade#isCharacterType()
     */
    public boolean isCharacterType()
    {
        return this.getSuperEntity().isCharacterType();
    }

    /**
     * Returns true if this type represents a Clob type.
     * @see ClassifierFacade#isClobType()
     */
    public boolean isClobType()
    {
        return this.getSuperEntity().isClobType();
    }

    /**
     * True if this classifier represents a collection type. False otherwise.
     * @see ClassifierFacade#isCollectionType()
     */
    public boolean isCollectionType()
    {
        return this.getSuperEntity().isCollectionType();
    }

    /**
     * True/false depending on whether or not this classifier represents a datatype. A data type is
     * a type whose instances are identified only by their value. A data type may contain attributes
     * to support the modeling of structured data types.
     * @see ClassifierFacade#isDataType()
     */
    public boolean isDataType()
    {
        return this.getSuperEntity().isDataType();
    }

    /**
     * True when this classifier is a date type.
     * @see ClassifierFacade#isDateType()
     */
    public boolean isDateType()
    {
        return this.getSuperEntity().isDateType();
    }

    /**
     * Indicates if this type represents a Double type or not.
     * @see ClassifierFacade#isDoubleType()
     */
    public boolean isDoubleType()
    {
        return this.getSuperEntity().isDoubleType();
    }

    /**
     * Indicates whether or not this classifier represents an "EmbeddedValue'.
     * @see ClassifierFacade#isEmbeddedValue()
     */
    public boolean isEmbeddedValue()
    {
        return this.getSuperEntity().isEmbeddedValue();
    }

    /**
     * True if this classifier is in fact marked as an enumeration.
     * @see ClassifierFacade#isEnumeration()
     */
    public boolean isEnumeration()
    {
        return this.getSuperEntity().isEnumeration();
    }

    /**
     * Returns true if this type represents a 'file' type.
     * @see ClassifierFacade#isFileType()
     */
    public boolean isFileType()
    {
        return this.getSuperEntity().isFileType();
    }

    /**
     * Indicates if this type represents a Float type or not.
     * @see ClassifierFacade#isFloatType()
     */
    public boolean isFloatType()
    {
        return this.getSuperEntity().isFloatType();
    }

    /**
     * Indicates if this type represents an int or Integer or java.lang.Integer type or not.
     * @see ClassifierFacade#isIntegerType()
     */
    public boolean isIntegerType()
    {
        return this.getSuperEntity().isIntegerType();
    }

    /**
     * True/false depending on whether or not this Classifier represents an interface.
     * @see ClassifierFacade#isInterface()
     */
    public boolean isInterface()
    {
        return this.getSuperEntity().isInterface();
    }

    /**
     * True if this classifier cannot be extended and represent a leaf in the inheritance tree.
     * @see ClassifierFacade#isLeaf()
     */
    public boolean isLeaf()
    {
        return this.getSuperEntity().isLeaf();
    }

    /**
     * True if this classifier represents a list type. False otherwise.
     * @see ClassifierFacade#isListType()
     */
    public boolean isListType()
    {
        return this.getSuperEntity().isListType();
    }

    /**
     * Indicates if this type represents a Long type or not.
     * @see ClassifierFacade#isLongType()
     */
    public boolean isLongType()
    {
        return this.getSuperEntity().isLongType();
    }

    /**
     * Indicates whether or not this classifier represents a Map type.
     * @see ClassifierFacade#isMapType()
     */
    public boolean isMapType()
    {
        return this.getSuperEntity().isMapType();
    }

    /**
     * Indicates whether or not this classifier represents a primitive type.
     * @see ClassifierFacade#isPrimitive()
     */
    public boolean isPrimitive()
    {
        return this.getSuperEntity().isPrimitive();
    }

    /**
     * True if this classifier represents a set type. False otherwise.
     * @see ClassifierFacade#isSetType()
     */
    public boolean isSetType()
    {
        return this.getSuperEntity().isSetType();
    }

    /**
     * Indicates whether or not this classifier represents a string type.
     * @see ClassifierFacade#isStringType()
     */
    public boolean isStringType()
    {
        return this.getSuperEntity().isStringType();
    }

    /**
     * Indicates whether or not this classifier represents a time type.
     * @see ClassifierFacade#isTimeType()
     */
    public boolean isTimeType()
    {
        return this.getSuperEntity().isTimeType();
    }

    /**
     * Returns true if this type is a wrapped primitive type.
     * @see ClassifierFacade#isWrappedPrimitive()
     */
    public boolean isWrappedPrimitive()
    {
        return this.getSuperEntity().isWrappedPrimitive();
    }

    /**
     * Returns a collection of all entities this entity and its ancestors have a relation to.
     * @see Entity#getAllEntityReferences()
     */
    public Collection<DependencyFacade> getAllEntityReferences()
    {
        return this.getSuperEntity().getAllEntityReferences();
    }

    /**
     * Gets a comma separated list of attribute names.  If 'follow' is true, will travel up the
     * inheritance hiearchy to include attributes in parent entities as well.  If 'withIdentifiers'
     * is true, will include identifiers.
     * @see Entity#getAttributeNameList(boolean follow, boolean withIdentifiers)
     */
    public String getAttributeNameList(boolean follow, boolean withIdentifiers)
    {
        return this.getSuperEntity().getAttributeNameList(follow, withIdentifiers);
    }

    /**
     * Gets a comma separated list of attribute names.  If 'follow' is true, will travel up the
     * inheritance hiearchy to include attributes in parent entities as well.  If 'withIdentifiers'
     * is true, will include identifiers  and  if 'withDerived' is set to true, will include derived
     * attributes.
     * @see Entity#getAttributeNameList(boolean follow, boolean withIdentifiers, boolean withDerived)
     */
    public String getAttributeNameList(boolean follow, boolean withIdentifiers, boolean withDerived)
    {
        return this.getSuperEntity().getAttributeNameList(follow, withIdentifiers, withDerived);
    }

    /**
     * Gets a comma separated list of attribute types.  If 'follow' is true, will travel up the
     * inheritance hierarchy to include attributes in parent entities as well.  If 'withIdentifiers'
     * is true, will include identifiers.
     * @see Entity#getAttributeTypeList(boolean follow, boolean withIdentifiers)
     */
    public String getAttributeTypeList(boolean follow, boolean withIdentifiers)
    {
        return this.getSuperEntity().getAttributeTypeList(follow, withIdentifiers);
    }

    /**
     * Gets all attributes of the entity, and optionally retieves the super entities attributes as
     * well as excludes the entity's identifiers if 'withIdentifiers' is set to false.
     * @see Entity#getAttributes(boolean follow, boolean withIdentifiers)
     */
    public Collection<AttributeFacade> getAttributes(boolean follow, boolean withIdentifiers)
    {
        return this.getSuperEntity().getAttributes(follow, withIdentifiers);
    }

    /**
     * Gets all attributes of the entity, and optionally retieves the super entities attributes as
     * well as excludes the entity's identifiers if 'withIdentifiers' is set to false and exclude
     * derived attributes if 'withDerived' is set to false.
     * @see Entity#getAttributes(boolean follow, boolean withIdentifiers, boolean withDerived)
     */
    public Collection<AttributeFacade> getAttributes(boolean follow, boolean withIdentifiers, boolean withDerived)
    {
        return this.getSuperEntity().getAttributes(follow, withIdentifiers, withDerived);
    }

    /**
     * All business operations of the entity, these include any operations that aren't queries.
     * @see Entity#getBusinessOperations()
     */
    public Collection<OperationFacade> getBusinessOperations()
    {
        return this.getSuperEntity().getBusinessOperations();
    }

    /**
     * Gets any children association ends (i.e. entity association ends that are participants in an
     * association with this entity and this entity has composite aggregation defined for those
     * associations).
     * @see Entity#getChildEnds()
     */
    public Collection<EntityAssociationEnd> getChildEnds()
    {
        return this.getSuperEntity().getChildEnds();
    }

    /**
     * The embedded values belonging to this entity.
     * @see Entity#getEmbeddedValues()
     */
    public Collection<AttributeFacade> getEmbeddedValues()
    {
        return this.getSuperEntity().getEmbeddedValues();
    }

    /**
     * All entities referenced by this entity.
     * @see Entity#getEntityReferences()
     */
    public Collection<DependencyFacade> getEntityReferences()
    {
        return this.getSuperEntity().getEntityReferences();
    }

    /**
     * The full name of the type of the identifier. If composite identifier add the PK sufix to the
     * class name. If not, retorns the fully qualified name of the identifier.
     * @see Entity#getFullyQualifiedIdentifierTypeName()
     */
    public String getFullyQualifiedIdentifierTypeName()
    {
        return this.getSuperEntity().getFullyQualifiedIdentifierTypeName();
    }

    /**
     * Gets all the associationEnds of this entity marked with the identifiers stereotype.
     * @see Entity#getIdentifierAssociationEnds()
     */
    public Collection<AssociationEndFacade> getIdentifierAssociationEnds()
    {
        return this.getSuperEntity().getIdentifierAssociationEnds();
    }

    /**
     * The getter name of the identifier.
     * @see Entity#getIdentifierGetterName()
     */
    public String getIdentifierGetterName()
    {
        return this.getSuperEntity().getIdentifierGetterName();
    }

    /**
     * The name of the identifier. If composite identifier add the Pk suffix. If not composite
     * returns the attribute name of the identifier.
     * @see Entity#getIdentifierName()
     */
    public String getIdentifierName()
    {
        return this.getSuperEntity().getIdentifierName();
    }

    /**
     * The setter name of the identifier.
     * @see Entity#getIdentifierSetterName()
     */
    public String getIdentifierSetterName()
    {
        return this.getSuperEntity().getIdentifierSetterName();
    }

    /**
     * The name of the type of the identifier. If composite identifier add the PK suffix to the
     * class name. If not, returns the name of the identifier.
     * @see Entity#getIdentifierTypeName()
     */
    public String getIdentifierTypeName()
    {
        return this.getSuperEntity().getIdentifierTypeName();
    }

    /**
     * All the attributes of the entity which make up its identifier (primary key).  Will search any
     * super classes as well.  If no identifiers exist, a default identifier will be created if the
     * allowDefaultIdentifiers property is set to true.
     * @see Entity#getIdentifiers()
     */
    public Collection<ModelElementFacade> getIdentifiers()
    {
        return this.getSuperEntity().getIdentifiers();
    }

    /**
     * Gets all identifiers for an entity. If 'follow' is true, and if no identifiers can be found
     * on the entity, a search up the inheritance chain will be performed, and the identifiers from
     * the first super class having them will be used.   If no identifiers exist, a default
     * identifier will be created if the allowDefaultIdentifiers property is set to true.
     * Identifiers can be on attributes or associations (composite primary key).
     * @see Entity#getIdentifiers(boolean follow)
     */
    public Collection<ModelElementFacade> getIdentifiers(boolean follow)
    {
        return this.getSuperEntity().getIdentifiers(follow);
    }

    /**
     * The maximum length a SQL name may be.
     * @see Entity#getMaxSqlNameLength()
     */
    public short getMaxSqlNameLength()
    {
        return this.getSuperEntity().getMaxSqlNameLength();
    }

    /**
     * Gets the attributes as a list within an operation call, optionally including the type names
     * and the identifier attributes.
     * @see Entity#getOperationCallFromAttributes(boolean withIdentifiers)
     */
    public String getOperationCallFromAttributes(boolean withIdentifiers)
    {
        return this.getSuperEntity().getOperationCallFromAttributes(withIdentifiers);
    }

    /**
     * Gets the attributes as a list within an operation call.  If 'withTypeNames' is true, it will
     * include the type names, if 'withIdentifiers' is true it will include the identifiers.  If
     * 'follow' is true it will follow the inheritance hierarchy and get the attributes of the super
     * class as well.
     * @see Entity#getOperationCallFromAttributes(boolean withIdentifiers, boolean follow)
     */
    public String getOperationCallFromAttributes(boolean withIdentifiers, boolean follow)
    {
        return this.getSuperEntity().getOperationCallFromAttributes(withIdentifiers, follow);
    }

    /**
     * Returns the parent association end of this entity if its a child entity.  The parent is the
     * entity that is the participant the association that has composite aggregation defined.  Will
     * return null if the entity has no parent.
     * @see Entity#getParentEnd()
     */
    public EntityAssociationEnd getParentEnd()
    {
        return this.getSuperEntity().getParentEnd();
    }

    /**
     * Gets all properties of this entity, this includes the attributes and navigable association
     * ends of the entity.  The 'follow' flag indcates whether or not the inheritance hierarchy
     * should be followed when getting all the properties.  The 'withIdentifiers' flag indicates
     * whether or not identifiers should be included in the collection of properties.
     * @see Entity#getProperties(boolean follow, boolean withIdentifiers)
     */
    public Collection<ModelElementFacade> getProperties(boolean follow, boolean withIdentifiers)
    {
        return this.getSuperEntity().getProperties(follow, withIdentifiers);
    }

    /**
     * Returns all the operations that can perform queries on the entity.
     * @see Entity#getQueryOperations()
     */
    public Collection<EntityQueryOperation> getQueryOperations()
    {
        return this.getSuperEntity().getQueryOperations();
    }

    /**
     * Gets all query operations for an entity. If 'follow' is true, and if no query operations can
     * be found on the entity, a search up the inheritance chain will be performed, and the
     * identifiers from the first super class having them will be used.   If no identifiers exist, a
     * default identifier will be created if the allowDefaultIdentifiers property is set to true.
     * @see Entity#getQueryOperations(boolean follow)
     */
    public Collection<OperationFacade> getQueryOperations(boolean follow)
    {
        return this.getSuperEntity().getQueryOperations(follow);
    }

    /**
     * Gets a comma separated list of required attribute names.  If 'follow' is true, will travel up
     * the inheritance hierarchy to include attributes in parent entities as well.  If
     * 'withIdentifiers' is true, will include identifiers.
     * @see Entity#getRequiredAttributeNameList(boolean follow, boolean withIdentifiers)
     */
    public String getRequiredAttributeNameList(boolean follow, boolean withIdentifiers)
    {
        return this.getSuperEntity().getRequiredAttributeNameList(follow, withIdentifiers);
    }

    /**
     * Gets a comma separated list of attribute types with are required.  If 'follow' is true, will
     * travel up the inheritance hierarchy to include attributes in parent entities as well.  If
     * 'withIdentifiers' is true, will include identifiers.
     * @see Entity#getRequiredAttributeTypeList(boolean follow, boolean withIdentifiers)
     */
    public String getRequiredAttributeTypeList(boolean follow, boolean withIdentifiers)
    {
        return this.getSuperEntity().getRequiredAttributeTypeList(follow, withIdentifiers);
    }

    /**
     * Returns all attributes that are specified as 'required' in the model.  If 'follow' is true,
     * then required attributes in super classes will also be returned, if false, just the ones
     * directly on the entity will be returned.  If 'withIdentifiers' is true, the identifiers will
     * be include, if false, no identifiers will be included.
     * @see Entity#getRequiredAttributes(boolean follow, boolean withIdentifiers)
     */
    public Collection<AttributeFacade> getRequiredAttributes(boolean follow, boolean withIdentifiers)
    {
        return this.getSuperEntity().getRequiredAttributes(follow, withIdentifiers);
    }

    /**
     * Gets all required properties for this entity.  These consist of any required attributes as
     * well as navigable associations that are marked as 'required'.  If 'follow' is true, then the
     * inheritance hierchy will be followed and all required properties from super classes will be
     * included as well.
     * If 'withIdentifiers' is true, the identifiers will be include, if false, no identifiers will
     * be included.
     * @see Entity#getRequiredProperties(boolean follow, boolean withIdentifiers)
     */
    public Collection<ModelElementFacade> getRequiredProperties(boolean follow, boolean withIdentifiers)
    {
        return this.getSuperEntity().getRequiredProperties(follow, withIdentifiers);
    }

    /**
     * Creates a comma separated list of the required property names.
     * @see Entity#getRequiredPropertyNameList(boolean follow, boolean withIdentifiers)
     */
    public String getRequiredPropertyNameList(boolean follow, boolean withIdentifiers)
    {
        return this.getSuperEntity().getRequiredPropertyNameList(follow, withIdentifiers);
    }

    /**
     * A comma separated list of the required property types.
     * @see Entity#getRequiredPropertyTypeList(boolean follow, boolean withIdentifiers)
     */
    public String getRequiredPropertyTypeList(boolean follow, boolean withIdentifiers)
    {
        return this.getSuperEntity().getRequiredPropertyTypeList(follow, withIdentifiers);
    }

    /**
     * The name of the schema that contains the database table
     * @see Entity#getSchema()
     */
    public String getSchema()
    {
        return this.getSuperEntity().getSchema();
    }

    /**
     * The name of the database table to which this entity is persisted.
     * @see Entity#getTableName()
     */
    public String getTableName()
    {
        return this.getSuperEntity().getTableName();
    }

    /**
     * Returns true/false depending on whether or not this entity represetns a child in an
     * association (this occurs when this entity is on the opposite end of an assocation end defined
     * as composite).
     * @see Entity#isChild()
     */
    public boolean isChild()
    {
        return this.getSuperEntity().isChild();
    }

    /**
     * True if this entity identifier is a composite (consists of multiple key columns, typically
     * abstracted into an external composite identifier class)
     * @see Entity#isCompositeIdentifier()
     */
    public boolean isCompositeIdentifier()
    {
        return this.getSuperEntity().isCompositeIdentifier();
    }

    /**
     * True if the entity has its identifiers dynamically added, false otherwise.
     * @see Entity#isDynamicIdentifiersPresent()
     */
    public boolean isDynamicIdentifiersPresent()
    {
        return this.getSuperEntity().isDynamicIdentifiersPresent();
    }

    /**
     * True if the entity has any identifiers defined, false otherwise.
     * @see Entity#isIdentifiersPresent()
     */
    public boolean isIdentifiersPresent()
    {
        return this.getSuperEntity().isIdentifiersPresent();
    }

    /**
     * Indiciates if this entity is using an assigned identifier or not.
     * @see Entity#isUsingAssignedIdentifier()
     */
    public boolean isUsingAssignedIdentifier()
    {
        return this.getSuperEntity().isUsingAssignedIdentifier();
    }

    /**
     * Indicates whether or not this entity is using a foreign identifier as its identifiers.  That
     * is: the foreignIdentifier flag was set on an incoming association end and the entity is
     * therefore using the related foreign parent entity's identifier.
     * @see Entity#isUsingForeignIdentifier()
     */
    public boolean isUsingForeignIdentifier()
    {
        return this.getSuperEntity().isUsingForeignIdentifier();
    }

    /**
     * Finds the tagged value optional searching the entire inheritance hierarchy if 'follow' is set
     * to true.
     * @see GeneralizableElementFacade#findTaggedValue(String tagName, boolean follow)
     */
    public Object findTaggedValue(String tagName, boolean follow)
    {
        return this.getSuperEntity().findTaggedValue(tagName, follow);
    }

    /**
     * All generalizations for this generalizable element, goes up the inheritance tree.
     * @see GeneralizableElementFacade#getAllGeneralizations()
     */
    public Collection<GeneralizableElementFacade> getAllGeneralizations()
    {
        return this.getSuperEntity().getAllGeneralizations();
    }

    /**
     * All specializations (travels down the inheritance hierarchy).
     * @see GeneralizableElementFacade#getAllSpecializations()
     */
    public Collection<GeneralizableElementFacade> getAllSpecializations()
    {
        return this.getSuperEntity().getAllSpecializations();
    }

    /**
     * Gets the direct generalization for this generalizable element.
     * @see GeneralizableElementFacade#getGeneralization()
     */
    public GeneralizableElementFacade getGeneralization()
    {
        return this.getSuperEntity().getGeneralization();
    }

    /**
     * Gets the actual links that this generalization element is part of (it plays either the
     * specialization or generalization).
     * @see GeneralizableElementFacade#getGeneralizationLinks()
     */
    public Collection<GeneralizationFacade> getGeneralizationLinks()
    {
        return this.getSuperEntity().getGeneralizationLinks();
    }

    /**
     * A comma separated list of the fully qualified names of all generalizations.
     * @see GeneralizableElementFacade#getGeneralizationList()
     */
    public String getGeneralizationList()
    {
        return this.getSuperEntity().getGeneralizationList();
    }

    /**
     * The element found when you recursively follow the generalization path up to the root. If an
     * element has no generalization itself will be considered the root.
     * @see GeneralizableElementFacade#getGeneralizationRoot()
     */
    public GeneralizableElementFacade getGeneralizationRoot()
    {
        return this.getSuperEntity().getGeneralizationRoot();
    }

    /**
     * Return all generalizations (ancestors) from this generalizable element.
     * @see GeneralizableElementFacade#getGeneralizations()
     */
    public Collection<GeneralizableElementFacade> getGeneralizations()
    {
        return this.getSuperEntity().getGeneralizations();
    }

    /**
     * Gets the direct specializations (i.e. sub elements) for this generalizatble element.
     * @see GeneralizableElementFacade#getSpecializations()
     */
    public Collection<GeneralizableElementFacade> getSpecializations()
    {
        return this.getSuperEntity().getSpecializations();
    }

    /**
     * Copies all tagged values from the given ModelElementFacade to this model element facade.
     * @see ModelElementFacade#copyTaggedValues(ModelElementFacade element)
     */
    public void copyTaggedValues(ModelElementFacade element)
    {
        this.getSuperEntity().copyTaggedValues(element);
    }

    /**
     * Finds the tagged value with the specified 'tagName'. In case there are more values the first
     * one found will be returned.
     * @see ModelElementFacade#findTaggedValue(String tagName)
     */
    public Object findTaggedValue(String tagName)
    {
        return this.getSuperEntity().findTaggedValue(tagName);
    }

    /**
     * Returns all the values for the tagged value with the specified name. The returned collection
     * will contains only String instances, or will be empty. Never null.
     * @see ModelElementFacade#findTaggedValues(String tagName)
     */
    public Collection<Object> findTaggedValues(String tagName)
    {
        return this.getSuperEntity().findTaggedValues(tagName);
    }

    /**
     * Returns the fully qualified name of the model element. The fully qualified name includes
     * complete package qualified name of the underlying model element. The templates parameter will
     * be replaced by the correct one given the binding relation of the parameter to this element.
     * @see ModelElementFacade#getBindedFullyQualifiedName(ModelElementFacade bindedElement)
     */
    public String getBindedFullyQualifiedName(ModelElementFacade bindedElement)
    {
        return this.getSuperEntity().getBindedFullyQualifiedName(bindedElement);
    }

    /**
     * Gets all constraints belonging to the model element.
     * @see ModelElementFacade#getConstraints()
     */
    public Collection<ConstraintFacade> getConstraints()
    {
        return this.getSuperEntity().getConstraints();
    }

    /**
     * Returns the constraints of the argument kind that have been placed onto this model. Typical
     * kinds are "inv", "pre" and "post". Other kinds are possible.
     * @see ModelElementFacade#getConstraints(String kind)
     */
    public Collection<ConstraintFacade> getConstraints(String kind)
    {
        return this.getSuperEntity().getConstraints(kind);
    }

    /**
     * Gets the documentation for the model element, The indent argument is prefixed to each line.
     * By default this method wraps lines after 64 characters.
     * This method is equivalent to <code>getDocumentation(indent, 64)</code>.
     * @see ModelElementFacade#getDocumentation(String indent)
     */
    public String getDocumentation(String indent)
    {
        return this.getSuperEntity().getDocumentation(indent);
    }

    /**
     * This method returns the documentation for this model element, with the lines wrapped after
     * the specified number of characters, values of less than 1 will indicate no line wrapping is
     * required. By default paragraphs are returned as HTML.
     * This method is equivalent to <code>getDocumentation(indent, lineLength, true)</code>.
     * @see ModelElementFacade#getDocumentation(String indent, int lineLength)
     */
    public String getDocumentation(String indent, int lineLength)
    {
        return this.getSuperEntity().getDocumentation(indent, lineLength);
    }

    /**
     * This method returns the documentation for this model element, with the lines wrapped after
     * the specified number of characters, values of less than 1 will indicate no line wrapping is
     * required. HTML style determines if HTML Escaping is applied.
     * @see ModelElementFacade#getDocumentation(String indent, int lineLength, boolean htmlStyle)
     */
    public String getDocumentation(String indent, int lineLength, boolean htmlStyle)
    {
        return this.getSuperEntity().getDocumentation(indent, lineLength, htmlStyle);
    }

    /**
     * The fully qualified name of this model element.
     * @see ModelElementFacade#getFullyQualifiedName()
     */
    public String getFullyQualifiedName()
    {
        return this.getSuperEntity().getFullyQualifiedName();
    }

    /**
     * Returns the fully qualified name of the model element. The fully qualified name includes
     * complete package qualified name of the underlying model element.  If modelName is true, then
     * the original name of the model element (the name contained within the model) will be the name
     * returned, otherwise a name from a language mapping will be returned.
     * @see ModelElementFacade#getFullyQualifiedName(boolean modelName)
     */
    public String getFullyQualifiedName(boolean modelName)
    {
        return this.getSuperEntity().getFullyQualifiedName(modelName);
    }

    /**
     * Returns the fully qualified name as a path, the returned value always starts with out a slash
     * '/'.
     * @see ModelElementFacade#getFullyQualifiedNamePath()
     */
    public String getFullyQualifiedNamePath()
    {
        return this.getSuperEntity().getFullyQualifiedNamePath();
    }

    /**
     * Gets the unique identifier of the underlying model element.
     * @see ModelElementFacade#getId()
     */
    public String getId()
    {
        return this.getSuperEntity().getId();
    }

    /**
     * UML2: Retrieves the keywords for this element. Used to modify implementation properties which
     * are not represented by other properties, i.e. native, transient, volatile, synchronized,
     * (added annotations) override, deprecated. Can also be used to suppress compiler warnings:
     * (added annotations) unchecked, fallthrough, path, serial, finally, all. Annotations require
     * JDK5 compiler level.
     * @see ModelElementFacade#getKeywords()
     */
    public Collection<String> getKeywords()
    {
        return this.getSuperEntity().getKeywords();
    }

    /**
     * UML2: Retrieves a localized label for this named element.
     * @see ModelElementFacade#getLabel()
     */
    public String getLabel()
    {
        return this.getSuperEntity().getLabel();
    }

    /**
     * The language mappings that have been set for this model element.
     * @see ModelElementFacade#getLanguageMappings()
     */
    public TypeMappings getLanguageMappings()
    {
        return this.getSuperEntity().getLanguageMappings();
    }

    /**
     * Return the model containing this model element (multiple models may be loaded and processed
     * at the same time).
     * @see ModelElementFacade#getModel()
     */
    public ModelFacade getModel()
    {
        return this.getSuperEntity().getModel();
    }

    /**
     * The name of the model element.
     * @see ModelElementFacade#getName()
     */
    public String getName()
    {
        return this.getSuperEntity().getName();
    }

    /**
     * Gets the package to which this model element belongs.
     * @see ModelElementFacade#getPackage()
     */
    public ModelElementFacade getPackage()
    {
        return this.getSuperEntity().getPackage();
    }

    /**
     * The name of this model element's package.
     * @see ModelElementFacade#getPackageName()
     */
    public String getPackageName()
    {
        return this.getSuperEntity().getPackageName();
    }

    /**
     * Gets the package name (optionally providing the ability to retrieve the model name and not
     * the mapped name).
     * @see ModelElementFacade#getPackageName(boolean modelName)
     */
    public String getPackageName(boolean modelName)
    {
        return this.getSuperEntity().getPackageName(modelName);
    }

    /**
     * Returns the package as a path, the returned value always starts with out a slash '/'.
     * @see ModelElementFacade#getPackagePath()
     */
    public String getPackagePath()
    {
        return this.getSuperEntity().getPackagePath();
    }

    /**
     * UML2: Returns the value of the 'Qualified Name' attribute. A name which allows the
     * NamedElement to be identified within a hierarchy of nested Namespaces. It is constructed from
     * the names of the containing namespaces starting at the root of the hierarchy and ending with
     * the name of the NamedElement itself.
     * @see ModelElementFacade#getQualifiedName()
     */
    public String getQualifiedName()
    {
        return this.getSuperEntity().getQualifiedName();
    }

    /**
     * Gets the root package for the model element.
     * @see ModelElementFacade#getRootPackage()
     */
    public PackageFacade getRootPackage()
    {
        return this.getSuperEntity().getRootPackage();
    }

    /**
     * Gets the dependencies for which this model element is the source.
     * @see ModelElementFacade#getSourceDependencies()
     */
    public Collection<DependencyFacade> getSourceDependencies()
    {
        return this.getSuperEntity().getSourceDependencies();
    }

    /**
     * If this model element is the context of an activity graph, this represents that activity
     * graph.
     * @see ModelElementFacade#getStateMachineContext()
     */
    public StateMachineFacade getStateMachineContext()
    {
        return this.getSuperEntity().getStateMachineContext();
    }

    /**
     * The collection of ALL stereotype names for this model element.
     * @see ModelElementFacade#getStereotypeNames()
     */
    public Collection<String> getStereotypeNames()
    {
        return this.getSuperEntity().getStereotypeNames();
    }

    /**
     * Gets all stereotypes for this model element.
     * @see ModelElementFacade#getStereotypes()
     */
    public Collection<StereotypeFacade> getStereotypes()
    {
        return this.getSuperEntity().getStereotypes();
    }

    /**
     * Return the TaggedValues associated with this model element, under all stereotypes.
     * @see ModelElementFacade#getTaggedValues()
     */
    public Collection<TaggedValueFacade> getTaggedValues()
    {
        return this.getSuperEntity().getTaggedValues();
    }

    /**
     * Gets the dependencies for which this model element is the target.
     * @see ModelElementFacade#getTargetDependencies()
     */
    public Collection<DependencyFacade> getTargetDependencies()
    {
        return this.getSuperEntity().getTargetDependencies();
    }

    /**
     * Get the template parameter for this model element having the parameterName
     * @see ModelElementFacade#getTemplateParameter(String parameterName)
     */
    public Object getTemplateParameter(String parameterName)
    {
        return this.getSuperEntity().getTemplateParameter(parameterName);
    }

    /**
     * Get the template parameters for this model element
     * @see ModelElementFacade#getTemplateParameters()
     */
    public Collection<TemplateParameterFacade> getTemplateParameters()
    {
        return this.getSuperEntity().getTemplateParameters();
    }

    /**
     * The visibility (i.e. public, private, protected or package) of the model element, will
     * attempt a lookup for these values in the language mappings (if any).
     * @see ModelElementFacade#getVisibility()
     */
    public String getVisibility()
    {
        return this.getSuperEntity().getVisibility();
    }

    /**
     * Returns true if the model element has the exact stereotype (meaning no stereotype inheritance
     * is taken into account when searching for the stereotype), false otherwise.
     * @see ModelElementFacade#hasExactStereotype(String stereotypeName)
     */
    public boolean hasExactStereotype(String stereotypeName)
    {
        return this.getSuperEntity().hasExactStereotype(stereotypeName);
    }

    /**
     * Does the UML Element contain the named Keyword? Keywords can be separated by space, comma,
     * pipe, semicolon, or << >>
     * @see ModelElementFacade#hasKeyword(String keywordName)
     */
    public boolean hasKeyword(String keywordName)
    {
        return this.getSuperEntity().hasKeyword(keywordName);
    }

    /**
     * Returns true if the model element has the specified stereotype.  If the stereotype itself
     * does not match, then a search will be made up the stereotype inheritance hierarchy, and if
     * one of the stereotype's ancestors has a matching name this method will return true, false
     * otherwise.
     * For example, if we have a certain stereotype called <<exception>> and a model element has a
     * stereotype called <<applicationException>> which extends <<exception>>, when calling this
     * method with 'stereotypeName' defined as 'exception' the method would return true since
     * <<applicationException>> inherits from <<exception>>.  If you want to check if the model
     * element has the exact stereotype, then use the method 'hasExactStereotype' instead.
     * @see ModelElementFacade#hasStereotype(String stereotypeName)
     */
    public boolean hasStereotype(String stereotypeName)
    {
        return this.getSuperEntity().hasStereotype(stereotypeName);
    }

    /**
     * True if there are target dependencies from this element that are instances of BindingFacade.
     * Deprecated in UML2: Use TemplateBinding parameters instead of dependencies.
     * @see ModelElementFacade#isBindingDependenciesPresent()
     */
    public boolean isBindingDependenciesPresent()
    {
        return this.getSuperEntity().isBindingDependenciesPresent();
    }

    /**
     * Indicates if any constraints are present on this model element.
     * @see ModelElementFacade#isConstraintsPresent()
     */
    public boolean isConstraintsPresent()
    {
        return this.getSuperEntity().isConstraintsPresent();
    }

    /**
     * Indicates if any documentation is present on this model element.
     * @see ModelElementFacade#isDocumentationPresent()
     */
    public boolean isDocumentationPresent()
    {
        return this.getSuperEntity().isDocumentationPresent();
    }

    /**
     * True if this element name is a reserved word in Java, C#, ANSI or ISO C, C++, JavaScript.
     * @see ModelElementFacade#isReservedWord()
     */
    public boolean isReservedWord()
    {
        return this.getSuperEntity().isReservedWord();
    }

    /**
     * True is there are template parameters on this model element. For UML2, applies to Class,
     * Operation, Property, and Parameter.
     * @see ModelElementFacade#isTemplateParametersPresent()
     */
    public boolean isTemplateParametersPresent()
    {
        return this.getSuperEntity().isTemplateParametersPresent();
    }

    /**
     * True if this element name is a valid identifier name in Java, C#, ANSI or ISO C, C++,
     * JavaScript. Contains no spaces, special characters etc. Constraint always applied on
     * Enumerations and Interfaces, optionally applies on other model elements.
     * @see ModelElementFacade#isValidIdentifierName()
     */
    public boolean isValidIdentifierName()
    {
        return this.getSuperEntity().isValidIdentifierName();
    }

    /**
     * Searches for the constraint with the specified 'name' on this model element, and if found
     * translates it using the specified 'translation' from a translation library discovered by the
     * framework.
     * @see ModelElementFacade#translateConstraint(String name, String translation)
     */
    public String translateConstraint(String name, String translation)
    {
        return this.getSuperEntity().translateConstraint(name, translation);
    }

    /**
     * Translates all constraints belonging to this model element with the given 'translation'.
     * @see ModelElementFacade#translateConstraints(String translation)
     */
    public String[] translateConstraints(String translation)
    {
        return this.getSuperEntity().translateConstraints(translation);
    }

    /**
     * Translates the constraints of the specified 'kind' belonging to this model element.
     * @see ModelElementFacade#translateConstraints(String kind, String translation)
     */
    public String[] translateConstraints(String kind, String translation)
    {
        return this.getSuperEntity().translateConstraints(kind, translation);
    }

    /**
     * @see MetafacadeBase#initialize()
     */
    @Override
    public void initialize()
    {
        this.getSuperEntity().initialize();
    }

    /**
     * @return Object getSuperEntity().getValidationOwner()
     * @see MetafacadeBase#getValidationOwner()
     */
    @Override
    public Object getValidationOwner()
    {
        Object owner = this.getSuperEntity().getValidationOwner();
        return owner;
    }

    /**
     * @return String getSuperEntity().getValidationName()
     * @see MetafacadeBase#getValidationName()
     */
    @Override
    public String getValidationName()
    {
        String name = this.getSuperEntity().getValidationName();
        return name;
    }

    /**
     * <p><b>Constraint:</b> org::andromda::cartridges::hibernate::metafacades::HibernateEntity::class inheritance strategy can not be mixed</p>
     * <p><b>Error:</b> If your Hibernate inheritance strategy is defined as 'class' on the root entity.  All sub classes must have an inheritance strategy of 'class' as well (the class inheritance strategy can not be mixed with any other types of strategies).</p>
     * <p><b>OCL:</b> context HibernateEntity
inv : hibernateInheritanceClass implies specializations -> forAll(hibernateInheritanceClass)</p>
     * <p><b>Constraint:</b> org::andromda::cartridges::hibernate::metafacades::HibernateEntity::subclass inheritance strategy can not be mixed</p>
     * <p><b>Error:</b> If your Hibernate inheritance strategy is defined as 'subclass' on the root entity.  All sub classes must have an inheritance strategy of 'subclass' as well (the subclass inheritance strategy can not be mixed with any other types of strategies).</p>
     * <p><b>OCL:</b> context HibernateEntity
inv : hibernateInheritanceSubclass implies specializations -> forAll(hibernateInheritanceSubclass)</p>
     * <p><b>Constraint:</b> org::andromda::cartridges::hibernate::metafacades::HibernateEntity::entity attributes must be of type data type.</p>
     * <p><b>Error:</b> All attributes of an entity (other than enumerations and embedded values) must be of UML DataType. Complex types must be UML Associations, not attributes.</p>
     * <p><b>OCL:</b> context HibernateEntity
inv: attributes -> forAll( not (type.enumeration or type.oclIsKindOf(HibernateEmbeddedValue))  implies type.dataType)</p>
     * <p><b>Constraint:</b> org::andromda::cartridges::hibernate::metafacades::HibernateEntity::increment, identity, sequence, hilo or seqhilo generator class requires a long, short, or int identifier</p>
     * <p><b>Error:</b> If the hibernate identifier generator class is set as 'increment', 'identity', 'sequence', 'hilo', 'seqhilo' or 'native', your mapped identifier type must resolve to a long (long or java.lang.Long or Long) , an int (int or java.lang.Integer or Integer), or a short (short or java.lang.Short or Short).</p>
     * <p><b>OCL:</b> context HibernateEntity
inv: let identifierTypeName : String = identifiers->first().type.fullyQualifiedName in hibernateGeneratorClass = 'increment' or hibernateGeneratorClass = 'identity' or hibernateGeneratorClass = 'sequence' or hibernateGeneratorClass = 'hilo' or hibernateGeneratorClass = 'seqhilo' or hibernateGeneratorClass = 'native' implies identifierTypeName = 'long' or identifierTypeName = 'java.lang.Long'  or identifierTypeName = 'Long'  or identifierTypeName = 'short' or identifierTypeName = 'java.lang.Short' or identifierTypeName = 'Short' or identifierTypeName = 'int' or identifierTypeName = 'java.lang.Integer' or identifierTypeName = 'Integer'</p>
     * <p><b>Constraint:</b> org::andromda::cartridges::hibernate::metafacades::HibernateEntity::uuid.hex or uuid.string generator class requires a String</p>
     * <p><b>Error:</b> If the hibernate identifier generator class is set as 'uuid.hex' or 'uuid.string' your mapped identifier type must resolve to 'String' or  'String'.</p>
     * <p><b>OCL:</b> context HibernateEntity
inv: let identifierTypeName : String = identifiers->first().type.fullyQualifiedName in hibernateGeneratorClass = 'uuid.hex' or hibernateGeneratorClass = 'uuid.string' implies identifierTypeName = 'String' or identifierTypeName = 'String'</p>
     * @param validationMessages Collection<ModelValidationMessage>
     * @see MetafacadeBase#validateInvariants(Collection validationMessages)
     */
    @Override
    public void validateInvariants(Collection<ModelValidationMessage> validationMessages)
    {
        this.getSuperEntity().validateInvariants(validationMessages);
        try
        {
            final Object contextElement = this.THIS();
            boolean constraintValid = OCLResultEnsurer.ensure((Boolean.valueOf(String.valueOf(OCLIntrospector.invoke(contextElement,"hibernateInheritanceClass"))).booleanValue()?OCLCollections.forAll(OCLIntrospector.invoke(contextElement,"specializations"),new Predicate(){public boolean evaluate(Object object){return Boolean.valueOf(String.valueOf(OCLIntrospector.invoke(object,"hibernateInheritanceClass"))).booleanValue();}}):true));
            if (!constraintValid)
            {
                validationMessages.add(
                    new ModelValidationMessage(
                        (MetafacadeBase)contextElement ,
                        "org::andromda::cartridges::hibernate::metafacades::HibernateEntity::class inheritance strategy can not be mixed",
                        "If your Hibernate inheritance strategy is defined as 'class' on the root entity.  All sub classes must have an inheritance strategy of 'class' as well (the class inheritance strategy can not be mixed with any other types of strategies)."));
            }
        }
        catch (Throwable th)
        {
            Throwable cause = th.getCause();
            int depth = 0; // Some throwables have infinite recursion
            while (cause != null && depth < 7)
            {
                th = cause;
                depth++;
            }
            logger.error("Error validating constraint 'org::andromda::cartridges::hibernate::metafacades::HibernateEntity::class inheritance strategy can not be mixed' ON "
                + this.THIS().toString() + ": " + th.getMessage(), th);
        }
        try
        {
            final Object contextElement = this.THIS();
            boolean constraintValid = OCLResultEnsurer.ensure((Boolean.valueOf(String.valueOf(OCLIntrospector.invoke(contextElement,"hibernateInheritanceSubclass"))).booleanValue()?OCLCollections.forAll(OCLIntrospector.invoke(contextElement,"specializations"),new Predicate(){public boolean evaluate(Object object){return Boolean.valueOf(String.valueOf(OCLIntrospector.invoke(object,"hibernateInheritanceSubclass"))).booleanValue();}}):true));
            if (!constraintValid)
            {
                validationMessages.add(
                    new ModelValidationMessage(
                        (MetafacadeBase)contextElement ,
                        "org::andromda::cartridges::hibernate::metafacades::HibernateEntity::subclass inheritance strategy can not be mixed",
                        "If your Hibernate inheritance strategy is defined as 'subclass' on the root entity.  All sub classes must have an inheritance strategy of 'subclass' as well (the subclass inheritance strategy can not be mixed with any other types of strategies)."));
            }
        }
        catch (Throwable th)
        {
            Throwable cause = th.getCause();
            int depth = 0; // Some throwables have infinite recursion
            while (cause != null && depth < 7)
            {
                th = cause;
                depth++;
            }
            logger.error("Error validating constraint 'org::andromda::cartridges::hibernate::metafacades::HibernateEntity::subclass inheritance strategy can not be mixed' ON "
                + this.THIS().toString() + ": " + th.getMessage(), th);
        }
        try
        {
            final Object contextElement = this.THIS();
            boolean constraintValid = OCLResultEnsurer.ensure(OCLCollections.forAll(OCLIntrospector.invoke(contextElement,"attributes"),new Predicate(){public boolean evaluate(Object object){return Boolean.valueOf(String.valueOf((Boolean.valueOf(String.valueOf(!(Boolean.valueOf(String.valueOf(OCLIntrospector.invoke(object,"type.enumeration"))).booleanValue()||OCLIntrospector.invoke(object,"type") instanceof HibernateEmbeddedValue))).booleanValue()?Boolean.valueOf(String.valueOf(OCLIntrospector.invoke(object,"type.dataType"))).booleanValue():true))).booleanValue();}}));
            if (!constraintValid)
            {
                validationMessages.add(
                    new ModelValidationMessage(
                        (MetafacadeBase)contextElement ,
                        "org::andromda::cartridges::hibernate::metafacades::HibernateEntity::entity attributes must be of type data type.",
                        "All attributes of an entity (other than enumerations and embedded values) must be of UML DataType. Complex types must be UML Associations, not attributes."));
            }
        }
        catch (Throwable th)
        {
            Throwable cause = th.getCause();
            int depth = 0; // Some throwables have infinite recursion
            while (cause != null && depth < 7)
            {
                th = cause;
                depth++;
            }
            logger.error("Error validating constraint 'org::andromda::cartridges::hibernate::metafacades::HibernateEntity::entity attributes must be of type data type.' ON "
                + this.THIS().toString() + ": " + th.getMessage(), th);
        }
        try
        {
            final Object contextElement = this.THIS();
            boolean constraintValid = OCLResultEnsurer.ensure((Boolean.valueOf(String.valueOf(OCLExpressions.equal(OCLIntrospector.invoke(contextElement,"hibernateGeneratorClass"),"increment")||OCLExpressions.equal(OCLIntrospector.invoke(contextElement,"hibernateGeneratorClass"),"identity")||OCLExpressions.equal(OCLIntrospector.invoke(contextElement,"hibernateGeneratorClass"),"sequence")||OCLExpressions.equal(OCLIntrospector.invoke(contextElement,"hibernateGeneratorClass"),"hilo")||OCLExpressions.equal(OCLIntrospector.invoke(contextElement,"hibernateGeneratorClass"),"seqhilo")||OCLExpressions.equal(OCLIntrospector.invoke(contextElement,"hibernateGeneratorClass"),"native"))).booleanValue()?OCLExpressions.equal(OCLIntrospector.invoke(OCLCollections.first(OCLIntrospector.invoke(contextElement,"identifiers")),"type.fullyQualifiedName"),"long"):true)||OCLExpressions.equal(OCLIntrospector.invoke(OCLCollections.first(OCLIntrospector.invoke(contextElement,"identifiers")),"type.fullyQualifiedName"),"java.lang.Long")||OCLExpressions.equal(OCLIntrospector.invoke(OCLCollections.first(OCLIntrospector.invoke(contextElement,"identifiers")),"type.fullyQualifiedName"),"Long")||OCLExpressions.equal(OCLIntrospector.invoke(OCLCollections.first(OCLIntrospector.invoke(contextElement,"identifiers")),"type.fullyQualifiedName"),"short")||OCLExpressions.equal(OCLIntrospector.invoke(OCLCollections.first(OCLIntrospector.invoke(contextElement,"identifiers")),"type.fullyQualifiedName"),"java.lang.Short")||OCLExpressions.equal(OCLIntrospector.invoke(OCLCollections.first(OCLIntrospector.invoke(contextElement,"identifiers")),"type.fullyQualifiedName"),"Short")||OCLExpressions.equal(OCLIntrospector.invoke(OCLCollections.first(OCLIntrospector.invoke(contextElement,"identifiers")),"type.fullyQualifiedName"),"int")||OCLExpressions.equal(OCLIntrospector.invoke(OCLCollections.first(OCLIntrospector.invoke(contextElement,"identifiers")),"type.fullyQualifiedName"),"java.lang.Integer")||OCLExpressions.equal(OCLIntrospector.invoke(OCLCollections.first(OCLIntrospector.invoke(contextElement,"identifiers")),"type.fullyQualifiedName"),"Integer"));
            if (!constraintValid)
            {
                validationMessages.add(
                    new ModelValidationMessage(
                        (MetafacadeBase)contextElement ,
                        "org::andromda::cartridges::hibernate::metafacades::HibernateEntity::increment, identity, sequence, hilo or seqhilo generator class requires a long, short, or int identifier",
                        "If the hibernate identifier generator class is set as 'increment', 'identity', 'sequence', 'hilo', 'seqhilo' or 'native', your mapped identifier type must resolve to a long (long or java.lang.Long or Long) , an int (int or java.lang.Integer or Integer), or a short (short or java.lang.Short or Short)."));
            }
        }
        catch (Throwable th)
        {
            Throwable cause = th.getCause();
            int depth = 0; // Some throwables have infinite recursion
            while (cause != null && depth < 7)
            {
                th = cause;
                depth++;
            }
            logger.error("Error validating constraint 'org::andromda::cartridges::hibernate::metafacades::HibernateEntity::increment, identity, sequence, hilo or seqhilo generator class requires a long, short, or int identifier' ON "
                + this.THIS().toString() + ": " + th.getMessage(), th);
        }
        try
        {
            final Object contextElement = this.THIS();
            boolean constraintValid = OCLResultEnsurer.ensure((Boolean.valueOf(String.valueOf(OCLExpressions.equal(OCLIntrospector.invoke(contextElement,"hibernateGeneratorClass"),"uuid.hex")||OCLExpressions.equal(OCLIntrospector.invoke(contextElement,"hibernateGeneratorClass"),"uuid.string"))).booleanValue()?OCLExpressions.equal(OCLIntrospector.invoke(OCLCollections.first(OCLIntrospector.invoke(contextElement,"identifiers")),"type.fullyQualifiedName"),"java.lang.String"):true)||OCLExpressions.equal(OCLIntrospector.invoke(OCLCollections.first(OCLIntrospector.invoke(contextElement,"identifiers")),"type.fullyQualifiedName"),"String"));
            if (!constraintValid)
            {
                validationMessages.add(
                    new ModelValidationMessage(
                        (MetafacadeBase)contextElement ,
                        "org::andromda::cartridges::hibernate::metafacades::HibernateEntity::uuid.hex or uuid.string generator class requires a String",
                        "If the hibernate identifier generator class is set as 'uuid.hex' or 'uuid.string' your mapped identifier type must resolve to 'String' or  'String'."));
            }
        }
        catch (Throwable th)
        {
            Throwable cause = th.getCause();
            int depth = 0; // Some throwables have infinite recursion
            while (cause != null && depth < 7)
            {
                th = cause;
                depth++;
            }
            logger.error("Error validating constraint 'org::andromda::cartridges::hibernate::metafacades::HibernateEntity::uuid.hex or uuid.string generator class requires a String' ON "
                + this.THIS().toString() + ": " + th.getMessage(), th);
        }
    }

    /**
     * The property that stores the name of the metafacade.
     */
    private static final String NAME_PROPERTY = "name";
    private static final String FQNAME_PROPERTY = "fullyQualifiedName";

    /**
     * @see Object#toString()
     */
    @Override
    public String toString()
    {
        final StringBuilder toString = new StringBuilder(this.getClass().getName());
        toString.append("[");
        try
        {
            toString.append(Introspector.instance().getProperty(this, FQNAME_PROPERTY));
        }
        catch (final Throwable tryAgain)
        {
            try
            {
                toString.append(Introspector.instance().getProperty(this, NAME_PROPERTY));
            }
            catch (final Throwable ignore)
            {
                // - just ignore when the metafacade doesn't have a name or fullyQualifiedName property
            }
        }
        toString.append("]");
        return toString.toString();
    }
}