8000 various minor fixes by gavinking · Pull Request #10171 · hibernate/hibernate-orm · GitHub
[go: up one dir, main page]

Skip to content

various minor fixes #10171

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
May 17, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
< 8000 /experimental-action-list>
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@
import org.hibernate.boot.model.naming.ImplicitBasicColumnNameSource;
import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
import org.hibernate.boot.model.naming.ObjectNameNormalizer;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.boot.model.relational.Database;
import org.hibernate.boot.model.source.spi.AttributePath;
import org.hibernate.boot.spi.InFlightMetadataCollector;
import org.hibernate.boot.spi.MetadataBuildingContext;
import org.hibernate.boot.spi.PropertyData;
import org.hibernate.internal.CoreMessageLogger;
Expand Down Expand Up @@ -299,7 +299,8 @@ protected void initMappingColumn(
else {
mappingColumn = new Column();
mappingColumn.setExplicit( !isImplicit );
redefineColumnName( columnName, propertyName, applyNamingStrategy );
final boolean nameDetermined =
inferColumnNameIfPossible( columnName, propertyName, applyNamingStrategy );
mappingColumn.setLength( length );
if ( precision != null && precision > 0 ) { //relevant precision
mappingColumn.setPrecision( precision );
Expand All @@ -311,7 +312,12 @@ protected void initMappingColumn(
mappingColumn.setArrayLength( arrayLength );
mappingColumn.setNullable( nullable );
mappingColumn.setSqlType( sqlType );
if ( unique ) {
mappingColumn.setUnique( unique );
// if the column name is not determined, we will assign the
// name to the unique key later this method gets called again
// from linkValueUsingDefaultColumnNaming() in second pass
if ( unique && nameDetermined ) {
// assign a unique key name to the column
getParent().getTable().createUniqueKey( mappingColumn, getBuildingContext() );
}
for ( CheckConstraint constraint : checkConstraints ) {
Expand Down Expand Up @@ -341,20 +347,29 @@ public boolean isNameDeferred() {
return mappingColumn == null || isEmpty( mappingColumn.getName() );
}

public void redefineColumnName(String columnName, String propertyName, boolean applyNamingStrategy) {
if ( StringHelper.isEmpty( columnName ) && StringHelper.isEmpty( propertyName ) ) {
// nothing to do
return;
/**
* Attempt to infer the column name from the explicit {@code name} given by the annotation and the property or field
* name. In the case of a {@link jakarta.persistence.JoinColumn}, this is impossible, due to the rules implemented in
* {@link org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl#determineJoinColumnName}. In cases
* where the column name cannot be inferred, the {@link Column} is not assigned a name, and this method returns
* {@code false}. The "dummy" {@code Column} will later be replaced with a {@code Column} with a name determined by
* the {@link ImplicitNamingStrategy} when {@link AnnotatedJoinColumn#linkValueUsingDefaultColumnNaming} is called
* during a {@link org.hibernate.boot.spi.SecondPass}.
* @return {@code true} if a name could be inferred
*/
boolean inferColumnNameIfPossible(String columnName, String propertyName, boolean applyNamingStrategy) {
if ( !isEmpty( columnName ) || !isEmpty( propertyName ) ) {
final String logicalColumnName = resolveLogicalColumnName( columnName, propertyName );
mappingColumn.setName( processColumnName( logicalColumnName, applyNamingStrategy ) );
return true;
}
else {
return false;
}
final String logicalColumnName = resolveLogicalColumnName( columnName, propertyName );
mappingColumn.setName( processColumnName( logicalColumnName, applyNamingStrategy ) );
}

private String resolveLogicalColumnName(String columnName, String propertyName) {
final String baseColumnName = StringHelper.isNotEmpty( columnName )
? columnName
: inferColumnName( propertyName );

final String baseColumnName = isNotEmpty( columnName ) ? columnName : inferColumnName( propertyName );
if ( parent.getPropertyHolder() != null && parent.getPropertyHolder().isComponent() ) {
// see if we need to apply one-or-more @EmbeddedColumnNaming patterns
return applyEmbeddedColumnNaming( baseColumnName, (ComponentPropertyHolder) parent.getPropertyHolder() );
Expand All @@ -370,7 +385,7 @@ private String applyEmbeddedColumnNaming(String inferredColumnName, ComponentPro
boolean appliedAnyPatterns = false;

final String columnNamingPattern = propertyHolder.getComponent().getColumnNamingPattern();
if ( StringHelper.isNotEmpty( columnNamingPattern ) ) {
if ( isNotEmpty( columnNamingPattern ) ) {
// zip_code
result = String.format( columnNamingPattern, result );
appliedAnyPatterns = true;
Expand All @@ -380,7 +395,7 @@ private String applyEmbeddedColumnNaming(String inferredColumnName, ComponentPro
while ( tester.parent.isComponent() ) {
final ComponentPropertyHolder parentHolder = (ComponentPropertyHolder) tester.parent;
final String parentColumnNamingPattern = parentHolder.getComponent().getColumnNamingPattern();
if ( StringHelper.isNotEmpty( parentColumnNamingPattern ) ) {
if ( isNotEmpty( parentColumnNamingPattern ) ) {
// home_zip_code
result = String.format( parentColumnNamingPattern, result );
appliedAnyPatterns = true;
Expand All @@ -398,24 +413,19 @@ private String applyEmbeddedColumnNaming(String inferredColumnName, ComponentPro

protected String processColumnName(String columnName, boolean applyNamingStrategy) {
if ( applyNamingStrategy ) {
final Database database = getBuildingContext().getMetadataCollector().getDatabase();
return getBuildingContext().getBuildingOptions().getPhysicalNamingStrategy()
final Database database = getDatabase();
return getPhysicalNamingStrategy()
.toPhysicalColumnName( database.toIdentifier( columnName ), database.getJdbcEnvironment() )
.render( database.getDialect() );
}
else {
return getBuildingContext().getObjectNameNormalizer().toDatabaseIdentifierText( columnName );
return getObjectNameNormalizer().toDatabaseIdentifierText( columnName );
}

}

protected String inferColumnName(String propertyName) {
final Database database = getBuildingContext().getMetadataCollector().getDatabase();
final ObjectNameNormalizer normalizer = getBuildingContext().getObjectNameNormalizer();
final ImplicitNamingStrategy implicitNamingStrategy = getBuildingContext().getBuildingOptions().getImplicitNamingStrategy();

Identifier implicitName = normalizer.normalizeIdentifierQuoting(
implicitNamingStrategy.determineBasicColumnName(
Identifier implicitName = getObjectNameNormalizer().normalizeIdentifierQuoting(
getImplicitNamingStrategy().determineBasicColumnName(
new ImplicitBasicColumnNameSource() {
final AttributePath attributePath = AttributePath.parse( propertyName );

Expand Down Expand Up @@ -448,11 +458,28 @@ public MetadataBuildingContext getBuildingContext() {
);
}

return getBuildingContext().getBuildingOptions().getPhysicalNamingStrategy()
final Database database = getDatabase();
return getPhysicalNamingStrategy()
.toPhysicalColumnName( implicitName, database.getJdbcEnvironment() )
.render( database.getDialect() );
}

private ObjectNameNormalizer getObjectNameNormalizer() {
return getBuildingContext().getObjectNameNormalizer();
}

private Database getDatabase() {
return getBuildingContext().getMetadataCollector().getDatabase();
}

private PhysicalNamingStrategy getPhysicalNamingStrategy() {
return getBuildingContext().getBuildingOptions().getPhysicalNamingStrategy();
}

private ImplicitNamingStrategy getImplicitNamingStrategy() {
return getBuildingContext().getBuildingOptions().getImplicitNamingStrategy();
}

public String getName() {
return mappingColumn.getName();
}
Expand Down Expand Up @@ -503,14 +530,12 @@ public void linkWithValue(SimpleValue value) {

protected void addColumnBinding(SimpleValue value) {
final String logicalColumnName;
final MetadataBuildingContext context = getBuildingContext();
final InFlightMetadataCollector collector = context.getMetadataCollector();
if ( isNotEmpty( this.logicalColumnName ) ) {
logicalColumnName = this.logicalColumnName;
}
else {
final Identifier implicitName = context.getObjectNameNormalizer().normalizeIdentifierQuoting(
context.getBuildingOptions().getImplicitNamingStrategy().determineBasicColumnName(
final Identifier implicitName = getObjectNameNormalizer().normalizeIdentifierQuoting(
getImplicitNamingStrategy().determineBasicColumnName(
new ImplicitBasicColumnNameSource() {
@Override
public AttributePath getAttributePath() {
Expand All @@ -524,14 +549,15 @@ public boolean isCollectionElement() {

@Override
public MetadataBuildingContext getBuildingContext() {
return context;
return AnnotatedColumn.this.getBuildingContext();
}
}
)
);
logicalColumnName = implicitName.render( collector.getDatabase().getDialect() );
logicalColumnName = implicitName.render( getDatabase().getDialect() );
}
collector.addColumnNameBinding( value.getTable(), logicalColumnName, getMappingColumn() );
getBuildingContext().getMetadataCollector()
.addColumnNameBinding( value.getTable(), logicalColumnName, getMappingColumn() );
}

public void forceNotNull() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
import org.hibernate.AssertionFailure;
import org.hibernate.annotations.JoinFormula;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
import org.hibernate.boot.model.naming.ObjectNameNormalizer;
import org.hibernate.boot.model.relational.Database;
import org.hibernate.boot.spi.InFlightMetadataCollector;
import org.hibernate.boot.spi.MetadataBuildingContext;
import org.hibernate.boot.spi.PropertyData;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.mapping.Column;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.SimpleValue;
Expand Down Expand Up @@ -313,6 +313,11 @@ public void copyReferencedStructureAndCreateDefaultJoinColumns(
setMappingColumn( null );
}

/**
* The JPA-specified rules implemented in
* {@link org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl#determineJoinColumnName}
* prevent us from assigning defaulted names to {@link JoinColumn} until the second pass.
*/
public void linkValueUsingDefaultColumnNaming(
Column referencedColumn,
PersistentClass referencedEntity,
Expand All @@ -326,11 +331,15 @@ public void linkValueUsingDefaultColumnNaming(
Column referencedColumn,
PersistentClass referencedEntity,
SimpleValue value) {
// In the case of a reference to a composite primary key,
// this instance of AnnotatedJoinColumn actually represents
// multiple foreign key columns, and this method will be
// called multiple times on the same instance
final String logicalReferencedColumn =
getBuildingContext().getMetadataCollector()
.getLogicalColumnName( referencedEntity.getTable(), referencedColumn.getQuotedName() );
final String columnName = defaultColumnName( columnIndex, referencedEntity, logicalReferencedColumn );
//yuk side effect on an implicit column
// awful side effect on an implicit column
setLogicalColumnName( columnName );
setImplicit( true );
setReferencedColumn( logicalReferencedColumn );
Expand Down Expand Up @@ -451,10 +460,23 @@ public void overrideFromReferencedColumnIfNecessary(Column column) {
}
}

/**
* Assign the column name from the explicit {@code name} given by the annotation, if any. In cases where the column
* name cannot be inferred, the {@link Column} is not assigned a name, and this method returns {@code false}. The
* "dummy" {@code Column} will later be replaced with a {@code Column} with name determined by the rules implemented
* in {@link org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl#determineJoinColumnName},
* as required by the JPA specification, or by any other custom {@link ImplicitNamingStrategy} when
* {@link #linkValueUsingDefaultColumnNaming} is called during a {@link org.hibernate.boot.spi.SecondPass}.
* @return {@code true} if a name could be inferred
*/
@Override
public void redefineColumnName(String columnName, String propertyName, boolean applyNamingStrategy) {
if ( StringHelper.isNotEmpty( columnName ) ) {
boolean inferColumnNameIfPossible(String columnName, String propertyName, boolean applyNamingStrategy) {
if ( isNotEmpty( columnName ) ) {
getMappingColumn().setName( processColumnName( columnName, applyNamingStrategy ) );
return true;
}
else {
return false;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -759,12 +759,13 @@ private static void bindImplicitColumns(
PersistentClass referencedEntity,
AnnotatedJoinColumns joinColumns,
SimpleValue value) {
final KeyValue keyValue = referencedEntity instanceof JoinedSubclass
? referencedEntity.getKey()
: referencedEntity.getIdentifier();
final List<Column> idColumns = keyValue.getColumns();
for ( int i = 0; i < idColumns.size(); i++ ) {
final Column column = idColumns.get(i);
final KeyValue keyValue =
referencedEntity instanceof JoinedSubclass
? referencedEntity.getKey() // a joined subclass is referenced via the key of the subclass table
: referencedEntity.getIdentifier();
final List<Column> referencedKeyColumns = keyValue.getColumns();
for ( int i = 0; i < referencedKeyColumns.size(); i++ ) {
final Column column = referencedKeyColumns.get(i);
final AnnotatedJoinColumn firstColumn = joinColumns.getJoinColumns().get(0);
firstColumn.linkValueUsingDefaultColumnNaming( i, column, referencedEntity, value );
firstColumn.overrideFromReferencedColumnIfNecessary( column );
Expand Down
Loading
0