in grails-datastore-gorm-hibernate/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java [2963:3032]
protected void bindColumn(PersistentProperty property, PersistentProperty parentProperty,
Column column, ColumnConfig cc, String path, Table table, String sessionFactoryBeanName) {
if (cc != null) {
column.setComment(cc.getComment());
column.setDefaultValue(cc.getDefaultValue());
column.setCustomRead(cc.getRead());
column.setCustomWrite(cc.getWrite());
}
Class<?> userType = getUserType(property);
String columnName = getColumnNameForPropertyAndPath(property, path, cc, sessionFactoryBeanName);
if ((property instanceof Association) && userType == null) {
Association association = (Association) property;
// Only use conventional naming when the column has not been explicitly mapped.
if (column.getName() == null) {
column.setName(columnName);
}
if (property instanceof ManyToMany) {
column.setNullable(false);
}
else if (property instanceof org.grails.datastore.mapping.model.types.OneToOne && association.isBidirectional() && !association.isOwningSide()) {
if (isHasOne(((Association) property).getInverseSide())) {
column.setNullable(false);
}
else {
column.setNullable(true);
}
}
else if ((property instanceof ToOne) && association.isCircular()) {
column.setNullable(true);
}
else {
column.setNullable(property.isNullable());
}
}
else {
column.setName(columnName);
column.setNullable(property.isNullable() || (parentProperty != null && parentProperty.isNullable()));
// Use the constraints for this property to more accurately define
// the column's length, precision, and scale
if (String.class.isAssignableFrom(property.getType()) || byte[].class.isAssignableFrom(property.getType())) {
bindStringColumnConstraints(column, property);
}
if (Number.class.isAssignableFrom(property.getType())) {
bindNumericColumnConstraints(column, property, cc);
}
}
handleUniqueConstraint(property, column, path, table, columnName, sessionFactoryBeanName);
bindIndex(columnName, column, cc, table);
final PersistentEntity owner = property.getOwner();
if (!owner.isRoot()) {
Mapping mapping = getMapping(owner);
if (mapping == null || mapping.getTablePerHierarchy()) {
if (LOG.isDebugEnabled())
LOG.debug("[GrailsDomainBinder] Sub class property [" + property.getName() + "] for column name ["+column.getName()+"] set to nullable");
column.setNullable(true);
} else {
column.setNullable(property.isNullable());
}
}
if (LOG.isDebugEnabled())
LOG.debug("[GrailsDomainBinder] bound property [" + property.getName() + "] to column name ["+column.getName()+"] in table ["+table.getName()+"]");
}