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);
}