in grails-datastore-gorm-hibernate/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java [2229:2291]
protected void bindComponentProperty(Component component, PersistentProperty componentProperty,
PersistentProperty currentGrailsProp, PersistentClass persistentClass,
String path, Table table, InFlightMetadataCollector mappings, String sessionFactoryBeanName) {
Value value;
// see if it's a collection type
CollectionType collectionType = CT.collectionTypeForClass(currentGrailsProp.getType());
if (collectionType != null) {
// create collection
Collection collection = collectionType.create((ToMany) currentGrailsProp, persistentClass,
path, mappings, sessionFactoryBeanName);
mappings.addCollectionBinding(collection);
value = collection;
}
// work out what type of relationship it is and bind value
else if (currentGrailsProp instanceof org.grails.datastore.mapping.model.types.ManyToOne) {
if (LOG.isDebugEnabled())
LOG.debug("[GrailsDomainBinder] Binding property [" + currentGrailsProp.getName() + "] as ManyToOne");
value = new ManyToOne(metadataBuildingContext, table);
bindManyToOne((Association) currentGrailsProp, (ManyToOne) value, path, mappings, sessionFactoryBeanName);
} else if (currentGrailsProp instanceof org.grails.datastore.mapping.model.types.OneToOne) {
if (LOG.isDebugEnabled())
LOG.debug("[GrailsDomainBinder] Binding property [" + currentGrailsProp.getName() + "] as OneToOne");
if (canBindOneToOneWithSingleColumnAndForeignKey((Association) currentGrailsProp)) {
value = new OneToOne(metadataBuildingContext, table, persistentClass);
bindOneToOne((org.grails.datastore.mapping.model.types.OneToOne) currentGrailsProp, (OneToOne) value, path, sessionFactoryBeanName);
}
else {
value = new ManyToOne(metadataBuildingContext, table);
bindManyToOne((Association) currentGrailsProp, (ManyToOne) value, path, mappings, sessionFactoryBeanName);
}
}
else if (currentGrailsProp instanceof Embedded) {
value = new Component(metadataBuildingContext, persistentClass);
bindComponent((Component) value, (Embedded) currentGrailsProp, true, mappings, sessionFactoryBeanName);
}
else {
if (LOG.isDebugEnabled())
LOG.debug("[GrailsDomainBinder] Binding property [" + currentGrailsProp.getName() + "] as SimpleValue");
value = new SimpleValue(metadataBuildingContext, table);
if (currentGrailsProp.getType().isEnum()) {
bindEnumType(currentGrailsProp, (SimpleValue) value, path, sessionFactoryBeanName);
}
else {
bindSimpleValue(currentGrailsProp, componentProperty, (SimpleValue) value, path,
mappings, sessionFactoryBeanName);
}
}
if (value != null) {
Property persistentProperty = createProperty(value, persistentClass, currentGrailsProp, mappings);
component.addProperty(persistentProperty);
if (isComponentPropertyNullable(componentProperty)) {
final Iterator<?> columnIterator = value.getColumnIterator();
while (columnIterator.hasNext()) {
Column c = (Column) columnIterator.next();
c.setNullable(true);
}
}
}
}