use of org.hibernate.boot.model.naming.ImplicitNamingStrategy in project hibernate-orm by hibernate.
the class TableBinder method bind.
// only bind association table currently
public Table bind() {
final Identifier ownerEntityTableNameIdentifier = toIdentifier(ownerEntityTable);
final Identifier associatedEntityTableNameIdentifier = toIdentifier(associatedEntityTable);
//logicalName only accurate for assoc table...
final String unquotedOwnerTable = StringHelper.unquote(ownerEntityTable);
final String unquotedAssocTable = StringHelper.unquote(associatedEntityTable);
//@ElementCollection use ownerEntity_property instead of the cleaner ownerTableName_property
// ownerEntity can be null when the table name is explicitly set; <== gb: doesn't seem to be true...
final String ownerObjectName = isJPA2ElementCollection && ownerEntity != null ? StringHelper.unqualify(ownerEntity) : unquotedOwnerTable;
final ObjectNameSource nameSource = buildNameContext(ownerObjectName, unquotedAssocTable);
final boolean ownerEntityTableQuoted = StringHelper.isQuoted(ownerEntityTable);
final boolean associatedEntityTableQuoted = StringHelper.isQuoted(associatedEntityTable);
final NamingStrategyHelper namingStrategyHelper = new NamingStrategyHelper() {
@Override
public Identifier determineImplicitName(final MetadataBuildingContext buildingContext) {
final ImplicitNamingStrategy namingStrategy = buildingContext.getBuildingOptions().getImplicitNamingStrategy();
Identifier name;
if (isJPA2ElementCollection) {
name = namingStrategy.determineCollectionTableName(new ImplicitCollectionTableNameSource() {
private final EntityNaming entityNaming = new EntityNaming() {
@Override
public String getClassName() {
return ownerClassName;
}
@Override
public String getEntityName() {
return ownerEntity;
}
@Override
public String getJpaEntityName() {
return ownerJpaEntity;
}
};
@Override
public Identifier getOwningPhysicalTableName() {
return ownerEntityTableNameIdentifier;
}
@Override
public EntityNaming getOwningEntityNaming() {
return entityNaming;
}
@Override
public AttributePath getOwningAttributePath() {
return AttributePath.parse(propertyName);
}
@Override
public MetadataBuildingContext getBuildingContext() {
return buildingContext;
}
});
} else {
name = namingStrategy.determineJoinTableName(new ImplicitJoinTableNameSource() {
private final EntityNaming owningEntityNaming = new EntityNaming() {
@Override
public String getClassName() {
return ownerClassName;
}
@Override
public String getEntityName() {
return ownerEntity;
}
@Override
public String getJpaEntityName() {
return ownerJpaEntity;
}
};
private final EntityNaming nonOwningEntityNaming = new EntityNaming() {
@Override
public String getClassName() {
return associatedClassName;
}
@Override
public String getEntityName() {
return associatedEntity;
}
@Override
public String getJpaEntityName() {
return associatedJpaEntity;
}
};
@Override
public String getOwningPhysicalTableName() {
return unquotedOwnerTable;
}
@Override
public EntityNaming getOwningEntityNaming() {
return owningEntityNaming;
}
@Override
public String getNonOwningPhysicalTableName() {
return unquotedAssocTable;
}
@Override
public EntityNaming getNonOwningEntityNaming() {
return nonOwningEntityNaming;
}
@Override
public AttributePath getAssociationOwningAttributePath() {
return AttributePath.parse(propertyName);
}
@Override
public MetadataBuildingContext getBuildingContext() {
return buildingContext;
}
});
}
if (ownerEntityTableQuoted || associatedEntityTableQuoted) {
name = Identifier.quote(name);
}
return name;
}
@Override
public Identifier handleExplicitName(String explicitName, MetadataBuildingContext buildingContext) {
return buildingContext.getMetadataCollector().getDatabase().toIdentifier(explicitName);
}
@Override
public Identifier toPhysicalName(Identifier logicalName, MetadataBuildingContext buildingContext) {
return buildingContext.getBuildingOptions().getPhysicalNamingStrategy().toPhysicalTableName(logicalName, buildingContext.getMetadataCollector().getDatabase().getJdbcEnvironment());
}
};
return buildAndFillTable(schema, catalog, nameSource, namingStrategyHelper, isAbstract, uniqueConstraints, jpaIndexHolders, constraints, buildingContext, null, null);
}
use of org.hibernate.boot.model.naming.ImplicitNamingStrategy in project hibernate-orm by hibernate.
the class Ejb3Column method redefineColumnName.
public void redefineColumnName(String columnName, String propertyName, boolean applyNamingStrategy) {
final ObjectNameNormalizer normalizer = context.getObjectNameNormalizer();
final Database database = context.getMetadataCollector().getDatabase();
final ImplicitNamingStrategy implicitNamingStrategy = context.getBuildingOptions().getImplicitNamingStrategy();
final PhysicalNamingStrategy physicalNamingStrategy = context.getBuildingOptions().getPhysicalNamingStrategy();
if (applyNamingStrategy) {
if (StringHelper.isEmpty(columnName)) {
if (propertyName != null) {
final AttributePath attributePath = AttributePath.parse(propertyName);
Identifier implicitName = normalizer.normalizeIdentifierQuoting(implicitNamingStrategy.determineBasicColumnName(new ImplicitBasicColumnNameSource() {
@Override
public AttributePath getAttributePath() {
return attributePath;
}
@Override
public boolean isCollectionElement() {
// @Column refers to the element column
return !propertyHolder.isComponent() && !propertyHolder.isEntity();
}
@Override
public MetadataBuildingContext getBuildingContext() {
return context;
}
}));
// HHH-6005 magic
if (implicitName.getText().contains("_collection&&element_")) {
implicitName = Identifier.toIdentifier(implicitName.getText().replace("_collection&&element_", "_"), implicitName.isQuoted());
}
final Identifier physicalName = physicalNamingStrategy.toPhysicalColumnName(implicitName, database.getJdbcEnvironment());
mappingColumn.setName(physicalName.render(database.getDialect()));
}
//Do nothing otherwise
} else {
final Identifier explicitName = database.toIdentifier(columnName);
final Identifier physicalName = physicalNamingStrategy.toPhysicalColumnName(explicitName, database.getJdbcEnvironment());
mappingColumn.setName(physicalName.render(database.getDialect()));
}
} else {
if (StringHelper.isNotEmpty(columnName)) {
mappingColumn.setName(normalizer.toDatabaseIdentifierText(columnName));
}
}
}
use of org.hibernate.boot.model.naming.ImplicitNamingStrategy in project hibernate-orm by hibernate.
the class Ejb3Column method addColumnBinding.
protected void addColumnBinding(SimpleValue value) {
final String logicalColumnName;
if (StringHelper.isNotEmpty(this.logicalColumnName)) {
logicalColumnName = this.logicalColumnName;
} else {
final ObjectNameNormalizer normalizer = context.getObjectNameNormalizer();
final Database database = context.getMetadataCollector().getDatabase();
final ImplicitNamingStrategy implicitNamingStrategy = context.getBuildingOptions().getImplicitNamingStrategy();
final Identifier implicitName = normalizer.normalizeIdentifierQuoting(implicitNamingStrategy.determineBasicColumnName(new ImplicitBasicColumnNameSource() {
@Override
public AttributePath getAttributePath() {
return AttributePath.parse(propertyName);
}
@Override
public boolean isCollectionElement() {
return false;
}
@Override
public MetadataBuildingContext getBuildingContext() {
return context;
}
}));
logicalColumnName = implicitName.render(database.getDialect());
}
context.getMetadataCollector().addColumnNameBinding(value.getTable(), logicalColumnName, getMappingColumn());
}
use of org.hibernate.boot.model.naming.ImplicitNamingStrategy in project hibernate-orm by hibernate.
the class Ejb3JoinColumn method buildDefaultColumnName.
private String buildDefaultColumnName(final PersistentClass referencedEntity, final String logicalReferencedColumn) {
final Database database = getBuildingContext().getMetadataCollector().getDatabase();
final ImplicitNamingStrategy implicitNamingStrategy = getBuildingContext().getBuildingOptions().getImplicitNamingStrategy();
final PhysicalNamingStrategy physicalNamingStrategy = getBuildingContext().getBuildingOptions().getPhysicalNamingStrategy();
Identifier columnIdentifier;
boolean mappedBySide = mappedByTableName != null || mappedByPropertyName != null;
boolean ownerSide = getPropertyName() != null;
Boolean isRefColumnQuoted = StringHelper.isQuoted(logicalReferencedColumn);
final String unquotedLogicalReferenceColumn = isRefColumnQuoted ? StringHelper.unquote(logicalReferencedColumn) : logicalReferencedColumn;
if (mappedBySide) {
// NOTE : While it is completely misleading here to allow for the combination
// of a "JPA ElementCollection" to be mappedBy, the code that uses this
// class relies on this behavior for handling the inverse side of
// many-to-many mappings
final AttributePath attributePath = AttributePath.parse(mappedByPropertyName);
final ImplicitJoinColumnNameSource.Nature implicitNamingNature;
if (getPropertyHolder().isEntity()) {
implicitNamingNature = ImplicitJoinColumnNameSource.Nature.ENTITY;
} else if (JPA2ElementCollection) {
implicitNamingNature = ImplicitJoinColumnNameSource.Nature.ELEMENT_COLLECTION;
} else {
implicitNamingNature = ImplicitJoinColumnNameSource.Nature.ENTITY_COLLECTION;
}
columnIdentifier = implicitNamingStrategy.determineJoinColumnName(new ImplicitJoinColumnNameSource() {
private final EntityNaming entityNaming = new EntityNaming() {
@Override
public String getClassName() {
return referencedEntity.getClassName();
}
@Override
public String getEntityName() {
return referencedEntity.getEntityName();
}
@Override
public String getJpaEntityName() {
return referencedEntity.getJpaEntityName();
}
};
private final Identifier referencedTableName = getBuildingContext().getMetadataCollector().getDatabase().toIdentifier(mappedByTableName);
@Override
public Nature getNature() {
return implicitNamingNature;
}
@Override
public EntityNaming getEntityNaming() {
return entityNaming;
}
@Override
public AttributePath getAttributePath() {
return attributePath;
}
@Override
public Identifier getReferencedTableName() {
return referencedTableName;
}
@Override
public Identifier getReferencedColumnName() {
if (logicalReferencedColumn != null) {
return getBuildingContext().getMetadataCollector().getDatabase().toIdentifier(logicalReferencedColumn);
}
if (mappedByEntityName == null || mappedByPropertyName == null) {
return null;
}
final PersistentClass mappedByEntityBinding = getBuildingContext().getMetadataCollector().getEntityBinding(mappedByEntityName);
final Property mappedByProperty = mappedByEntityBinding.getProperty(mappedByPropertyName);
final SimpleValue value = (SimpleValue) mappedByProperty.getValue();
final Iterator<Selectable> selectableValues = value.getColumnIterator();
if (!selectableValues.hasNext()) {
throw new AnnotationException(String.format(Locale.ENGLISH, "mapped-by [%s] defined for attribute [%s] referenced an invalid property (no columns)", mappedByPropertyName, propertyHolder.getPath()));
}
final Selectable selectable = selectableValues.next();
if (!Column.class.isInstance(selectable)) {
throw new AnnotationException(String.format(Locale.ENGLISH, "mapped-by [%s] defined for attribute [%s] referenced an invalid property (formula)", mappedByPropertyName, propertyHolder.getPath()));
}
if (selectableValues.hasNext()) {
throw new AnnotationException(String.format(Locale.ENGLISH, "mapped-by [%s] defined for attribute [%s] referenced an invalid property (multiple columns)", mappedByPropertyName, propertyHolder.getPath()));
}
return getBuildingContext().getMetadataCollector().getDatabase().toIdentifier(((Column) selectable).getQuotedName());
}
@Override
public MetadataBuildingContext getBuildingContext() {
return Ejb3JoinColumn.this.getBuildingContext();
}
});
//one element was quoted so we quote
if (isRefColumnQuoted || StringHelper.isQuoted(mappedByTableName)) {
columnIdentifier = Identifier.quote(columnIdentifier);
}
} else if (ownerSide) {
final String logicalTableName = getBuildingContext().getMetadataCollector().getLogicalTableName(referencedEntity.getTable());
final ImplicitJoinColumnNameSource.Nature implicitNamingNature;
if (JPA2ElementCollection) {
implicitNamingNature = ImplicitJoinColumnNameSource.Nature.ELEMENT_COLLECTION;
} else if (getPropertyHolder().isEntity()) {
implicitNamingNature = ImplicitJoinColumnNameSource.Nature.ENTITY;
} else {
implicitNamingNature = ImplicitJoinColumnNameSource.Nature.ENTITY_COLLECTION;
}
columnIdentifier = getBuildingContext().getBuildingOptions().getImplicitNamingStrategy().determineJoinColumnName(new ImplicitJoinColumnNameSource() {
private final EntityNaming entityNaming = new EntityNaming() {
@Override
public String getClassName() {
return referencedEntity.getClassName();
}
@Override
public String getEntityName() {
return referencedEntity.getEntityName();
}
@Override
public String getJpaEntityName() {
return referencedEntity.getJpaEntityName();
}
};
private final AttributePath attributePath = AttributePath.parse(getPropertyName());
private final Identifier referencedTableName = getBuildingContext().getMetadataCollector().getDatabase().toIdentifier(logicalTableName);
private final Identifier referencedColumnName = getBuildingContext().getMetadataCollector().getDatabase().toIdentifier(logicalReferencedColumn);
@Override
public Nature getNature() {
return implicitNamingNature;
}
@Override
public EntityNaming getEntityNaming() {
return entityNaming;
}
@Override
public AttributePath getAttributePath() {
return attributePath;
}
@Override
public Identifier getReferencedTableName() {
return referencedTableName;
}
@Override
public Identifier getReferencedColumnName() {
return referencedColumnName;
}
@Override
public MetadataBuildingContext getBuildingContext() {
return Ejb3JoinColumn.this.getBuildingContext();
}
});
//one element was quoted so we quote
if (isRefColumnQuoted || StringHelper.isQuoted(logicalTableName)) {
columnIdentifier = Identifier.quote(columnIdentifier);
}
} else {
final Identifier logicalTableName = database.toIdentifier(getBuildingContext().getMetadataCollector().getLogicalTableName(referencedEntity.getTable()));
// is an intra-entity hierarchy table join so copy the name by default
columnIdentifier = implicitNamingStrategy.determinePrimaryKeyJoinColumnName(new ImplicitPrimaryKeyJoinColumnNameSource() {
@Override
public MetadataBuildingContext getBuildingContext() {
return Ejb3JoinColumn.this.getBuildingContext();
}
@Override
public Identifier getReferencedTableName() {
return logicalTableName;
}
@Override
public Identifier getReferencedPrimaryKeyColumnName() {
return database.toIdentifier(logicalReferencedColumn);
}
});
if (!columnIdentifier.isQuoted() && (isRefColumnQuoted || logicalTableName.isQuoted())) {
columnIdentifier = Identifier.quote(columnIdentifier);
}
}
return physicalNamingStrategy.toPhysicalColumnName(columnIdentifier, database.getJdbcEnvironment()).render(database.getJdbcEnvironment().getDialect());
}
use of org.hibernate.boot.model.naming.ImplicitNamingStrategy in project hibernate-orm by hibernate.
the class Ejb3Column method buildColumnFromAnnotation.
public static Ejb3Column[] buildColumnFromAnnotation(javax.persistence.Column[] anns, org.hibernate.annotations.Formula formulaAnn, Nullability nullability, PropertyHolder propertyHolder, PropertyData inferredData, String suffixForDefaultColumnName, Map<String, Join> secondaryTables, MetadataBuildingContext context) {
Ejb3Column[] columns;
if (formulaAnn != null) {
Ejb3Column formulaColumn = new Ejb3Column();
formulaColumn.setFormula(formulaAnn.value());
formulaColumn.setImplicit(false);
formulaColumn.setBuildingContext(context);
formulaColumn.setPropertyHolder(propertyHolder);
formulaColumn.bind();
columns = new Ejb3Column[] { formulaColumn };
} else {
javax.persistence.Column[] actualCols = anns;
javax.persistence.Column[] overriddenCols = propertyHolder.getOverriddenColumn(StringHelper.qualify(propertyHolder.getPath(), inferredData.getPropertyName()));
if (overriddenCols != null) {
//check for overridden first
if (anns != null && overriddenCols.length != anns.length) {
throw new AnnotationException("AttributeOverride.column() should override all columns for now");
}
actualCols = overriddenCols.length == 0 ? null : overriddenCols;
LOG.debugf("Column(s) overridden for property %s", inferredData.getPropertyName());
}
if (actualCols == null) {
columns = buildImplicitColumn(inferredData, suffixForDefaultColumnName, secondaryTables, propertyHolder, nullability, context);
} else {
final int length = actualCols.length;
columns = new Ejb3Column[length];
for (int index = 0; index < length; index++) {
final ObjectNameNormalizer normalizer = context.getObjectNameNormalizer();
final Database database = context.getMetadataCollector().getDatabase();
final ImplicitNamingStrategy implicitNamingStrategy = context.getBuildingOptions().getImplicitNamingStrategy();
final PhysicalNamingStrategy physicalNamingStrategy = context.getBuildingOptions().getPhysicalNamingStrategy();
javax.persistence.Column col = actualCols[index];
final String sqlType;
if (col.columnDefinition().equals("")) {
sqlType = null;
} else {
sqlType = normalizer.applyGlobalQuoting(col.columnDefinition());
}
final String tableName;
if (StringHelper.isEmpty(col.table())) {
tableName = "";
} else {
tableName = database.getJdbcEnvironment().getIdentifierHelper().toIdentifier(col.table()).render();
// final Identifier logicalName = database.getJdbcEnvironment()
// .getIdentifierHelper()
// .toIdentifier( col.table() );
// final Identifier physicalName = physicalNamingStrategy.toPhysicalTableName( logicalName );
// tableName = physicalName.render( database.getDialect() );
}
final String columnName;
if ("".equals(col.name())) {
columnName = null;
} else {
// NOTE : this is the logical column name, not the physical!
columnName = database.getJdbcEnvironment().getIdentifierHelper().toIdentifier(col.name()).render();
}
Ejb3Column column = new Ejb3Column();
if (length == 1) {
applyColumnDefault(column, inferredData);
}
column.setImplicit(false);
column.setSqlType(sqlType);
column.setLength(col.length());
column.setPrecision(col.precision());
column.setScale(col.scale());
if (StringHelper.isEmpty(columnName) && !StringHelper.isEmpty(suffixForDefaultColumnName)) {
column.setLogicalColumnName(inferredData.getPropertyName() + suffixForDefaultColumnName);
} else {
column.setLogicalColumnName(columnName);
}
column.setPropertyName(BinderHelper.getRelativePath(propertyHolder, inferredData.getPropertyName()));
column.setNullable(col.nullable());
//TODO force to not null if available? This is a (bad) user choice.
column.setUnique(col.unique());
column.setInsertable(col.insertable());
column.setUpdatable(col.updatable());
column.setExplicitTableName(tableName);
column.setPropertyHolder(propertyHolder);
column.setJoins(secondaryTables);
column.setBuildingContext(context);
column.extractDataFromPropertyData(inferredData);
column.bind();
columns[index] = column;
}
}
}
return columns;
}
Aggregations