public void initialize()

in grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/AbstractPersistentEntity.java [120:255]


    public void initialize() {
        ClassMapping<T> mapping = getMapping();
        if(!initialized) {


            initialized = true;

            final MappingConfigurationStrategy mappingSyntaxStrategy = context.getMappingSyntaxStrategy();
            owners = mappingSyntaxStrategy.getOwningEntities(javaClass, context);
            Class superClass = javaClass.getSuperclass();
            if (superClass != null &&
                    !superClass.equals(Object.class) ) {

                if(mappingSyntaxStrategy.isPersistentEntity(superClass)) {
                    parentEntity = context.addPersistentEntity(superClass);
                }
            }

            persistentProperties = mappingSyntaxStrategy.getPersistentProperties(this, context, mapping, includeIdentifiers());

            persistentPropertyNames = new ArrayList<>();
            associations = new ArrayList();
            embedded  = new ArrayList();


            boolean multiTenancyEnabled = isMultiTenant && context.getMultiTenancyMode() == MultiTenancySettings.MultiTenancyMode.DISCRIMINATOR;
            for (PersistentProperty persistentProperty : persistentProperties) {
                if(multiTenancyEnabled && persistentProperty instanceof TenantId) {
                    this.tenantId = (TenantId) persistentProperty;
                }
                if(persistentProperty instanceof Identity) {
                    if(compositeIdentity != null) {
                        int l = compositeIdentity.length;
                        compositeIdentity = Arrays.copyOf(compositeIdentity, l +1);
                        compositeIdentity[l] = identity;
                    }
                    else if(identity != null) {
                        compositeIdentity = new PersistentProperty[] { identity, persistentProperty };
                        identity = null;
                    }
                    else {
                        identity = persistentProperty;
                    }
                }

                if (!(persistentProperty instanceof OneToMany)) {
                    persistentPropertyNames.add(persistentProperty.getName());
                }

                if (persistentProperty instanceof Association) {
                    associations.add((Association) persistentProperty);
                }
                if( persistentProperty instanceof Embedded) {
                    embedded.add((Embedded)persistentProperty);
                }
                propertiesByName.put(persistentProperty.getName(), persistentProperty);
                final String targetName = persistentProperty.getMapping().getMappedForm().getTargetName();
                if(targetName != null) {
                    mappedPropertiesByName.put(targetName, persistentProperty);
                }
            }
            if(associations.isEmpty()) {
                associations = Collections.emptyList();
            }
            if(embedded.isEmpty()) {
                embedded = Collections.emptyList();
            }

            if(identity == null && compositeIdentity == null) {
                identity = resolveIdentifier();
            }

            if(multiTenancyEnabled && tenantId == null) {
                throw new ConfigurationException("Class ["+javaClass.getName()+"] is multi tenant but does not specify a tenant identifier property");
            }

            if(!isExternal()) {

                final T mappedForm = mapping.getMappedForm();// initialize mapping

                if (mappedForm.isVersioned()) {
                    version = propertiesByName.get(GormProperties.VERSION);
                    if(version == null) {
                        versioned = false;
                    }
                }
                else {
                    versioned = false;
                }
            }

            final PersistentProperty v = getVersion();
            if(v != null) {
                final Class type = v.getType();
                this.versionCompatibleType = Number.class.isAssignableFrom(type) || Date.class.isAssignableFrom(type);
            }


            if(identity != null) {
                String idName = identity.getName();
                PersistentProperty idProp = propertiesByName.get(idName);
                if(idProp == null) {
                    propertiesByName.put(idName, identity);
                }
                else {
                    persistentProperties.remove(idProp);
                    persistentPropertyNames.remove(idProp.getName());
                    if(!idProp.getName().equals(GormProperties.IDENTITY)) {
                        disableDefaultId();
                    }
                }
            }
            IdentityMapping identifier = mapping != null ? mapping.getIdentifier() : null;
            if(identity == null && identifier != null) {

                final String[] identifierName = identifier.getIdentifierName();
                final MappingContext mappingContext = getMappingContext();
                if(identifierName.length > 1) {
                    compositeIdentity = mappingContext.getMappingSyntaxStrategy().getCompositeIdentity(javaClass, mappingContext);
                }
                for (String in : identifierName) {
                    final PersistentProperty p = propertiesByName.get(in);
                    if(p != null) {
                        persistentProperties.remove(p);
                    }
                    persistentPropertyNames.remove(in);
                }
                disableDefaultId();
            }
        }



        propertiesInitialized = true;
        this.entityReflector = getMappingContext().getEntityReflector(this);
    }