HHH-9961 - Ejb3JoinColumn does not use PhysicalNamingStrategy
This commit is contained in:
parent
c1af6433c2
commit
923ecb8e2c
|
@ -23,6 +23,7 @@ import org.hibernate.annotations.JoinFormula;
|
|||
import org.hibernate.annotations.common.reflection.XClass;
|
||||
import org.hibernate.boot.model.naming.EntityNaming;
|
||||
import org.hibernate.boot.model.naming.Identifier;
|
||||
import org.hibernate.boot.model.naming.ImplicitBasicColumnNameSource;
|
||||
import org.hibernate.boot.model.naming.ImplicitJoinColumnNameSource;
|
||||
import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
|
||||
import org.hibernate.boot.model.naming.ImplicitPrimaryKeyJoinColumnNameSource;
|
||||
|
@ -495,7 +496,7 @@ public class Ejb3JoinColumn extends Ejb3Column {
|
|||
final ImplicitNamingStrategy implicitNamingStrategy = getBuildingContext().getBuildingOptions().getImplicitNamingStrategy();
|
||||
final PhysicalNamingStrategy physicalNamingStrategy = getBuildingContext().getBuildingOptions().getPhysicalNamingStrategy();
|
||||
|
||||
String columnName;
|
||||
Identifier columnIdentifier;
|
||||
boolean mappedBySide = mappedByTableName != null || mappedByPropertyName != null;
|
||||
boolean ownerSide = getPropertyName() != null;
|
||||
|
||||
|
@ -505,8 +506,6 @@ public class Ejb3JoinColumn extends Ejb3Column {
|
|||
: logicalReferencedColumn;
|
||||
|
||||
if ( mappedBySide ) {
|
||||
final Identifier columnIdentifier;
|
||||
|
||||
// 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
|
||||
|
@ -579,7 +578,8 @@ public class Ejb3JoinColumn extends Ejb3Column {
|
|||
return null;
|
||||
}
|
||||
|
||||
final PersistentClass mappedByEntityBinding = getBuildingContext().getMetadataCollector().getEntityBinding( mappedByEntityName );
|
||||
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();
|
||||
|
@ -626,10 +626,9 @@ public class Ejb3JoinColumn extends Ejb3Column {
|
|||
}
|
||||
);
|
||||
|
||||
columnName = columnIdentifier.render();
|
||||
//one element was quoted so we quote
|
||||
if ( isRefColumnQuoted || StringHelper.isQuoted( mappedByTableName ) ) {
|
||||
columnName = StringHelper.quote( columnName );
|
||||
columnIdentifier = Identifier.quote( columnIdentifier );
|
||||
}
|
||||
}
|
||||
else if ( ownerSide ) {
|
||||
|
@ -647,7 +646,8 @@ public class Ejb3JoinColumn extends Ejb3Column {
|
|||
else {
|
||||
implicitNamingNature = ImplicitJoinColumnNameSource.Nature.ENTITY_COLLECTION;
|
||||
}
|
||||
Identifier columnNameIdentifier = getBuildingContext().getBuildingOptions().getImplicitNamingStrategy().determineJoinColumnName(
|
||||
|
||||
columnIdentifier = getBuildingContext().getBuildingOptions().getImplicitNamingStrategy().determineJoinColumnName(
|
||||
new ImplicitJoinColumnNameSource() {
|
||||
private final EntityNaming entityNaming = new EntityNaming() {
|
||||
@Override
|
||||
|
@ -705,11 +705,11 @@ public class Ejb3JoinColumn extends Ejb3Column {
|
|||
}
|
||||
}
|
||||
);
|
||||
|
||||
//one element was quoted so we quote
|
||||
if ( isRefColumnQuoted || StringHelper.isQuoted( logicalTableName ) ) {
|
||||
Identifier.quote( columnNameIdentifier );
|
||||
columnIdentifier = Identifier.quote( columnIdentifier );
|
||||
}
|
||||
columnName = columnNameIdentifier.render();
|
||||
}
|
||||
else {
|
||||
final Identifier logicalTableName = database.toIdentifier(
|
||||
|
@ -717,7 +717,7 @@ public class Ejb3JoinColumn extends Ejb3Column {
|
|||
);
|
||||
|
||||
// is an intra-entity hierarchy table join so copy the name by default
|
||||
Identifier columnIdentifier = implicitNamingStrategy.determinePrimaryKeyJoinColumnName(
|
||||
columnIdentifier = implicitNamingStrategy.determinePrimaryKeyJoinColumnName(
|
||||
new ImplicitPrimaryKeyJoinColumnNameSource() {
|
||||
@Override
|
||||
public MetadataBuildingContext getBuildingContext() {
|
||||
|
@ -739,11 +739,10 @@ public class Ejb3JoinColumn extends Ejb3Column {
|
|||
if ( !columnIdentifier.isQuoted() && ( isRefColumnQuoted || logicalTableName.isQuoted() ) ) {
|
||||
columnIdentifier = Identifier.quote( columnIdentifier );
|
||||
}
|
||||
|
||||
columnName = columnIdentifier.render();
|
||||
}
|
||||
|
||||
return columnName;
|
||||
return physicalNamingStrategy.toPhysicalColumnName( columnIdentifier, database.getJdbcEnvironment() )
|
||||
.render( database.getJdbcEnvironment().getDialect() );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||
*/
|
||||
package org.hibernate.test.namingstrategy.ejb3joincolumn;
|
||||
|
||||
import javax.persistence.Access;
|
||||
import javax.persistence.AccessType;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.ManyToOne;
|
||||
|
||||
/**
|
||||
* @author Anton Wimmer
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
@Entity
|
||||
//@Immutable
|
||||
//@Cacheable
|
||||
//@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
|
||||
//@SuppressWarnings("serial")
|
||||
public class Language {
|
||||
|
||||
@Id
|
||||
@Access(AccessType.PROPERTY)
|
||||
private Long id = null;
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
// @Column(unique = true)
|
||||
// @Lob
|
||||
// @Type(type = "org.hibernate.type.TextType")
|
||||
private String name;
|
||||
|
||||
@ManyToOne(optional = true)
|
||||
@JoinColumn
|
||||
private Language fallBack;
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Language getFallBack() {
|
||||
return fallBack;
|
||||
}
|
||||
|
||||
public void setFallBack(Language fallBack) {
|
||||
this.fallBack = fallBack;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||
*/
|
||||
package org.hibernate.test.namingstrategy.ejb3joincolumn;
|
||||
|
||||
import org.hibernate.boot.model.naming.Identifier;
|
||||
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
|
||||
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
|
||||
|
||||
/**
|
||||
* @author Anton Wimmer
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class PhysicalNamingStrategyImpl extends PhysicalNamingStrategyStandardImpl {
|
||||
/**
|
||||
* Singleton access
|
||||
*/
|
||||
public static final PhysicalNamingStrategyImpl INSTANCE = new PhysicalNamingStrategyImpl();
|
||||
|
||||
@Override
|
||||
public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) {
|
||||
return Identifier.toIdentifier(makeCleanIdentifier("tbl_" + name.getText()), name.isQuoted());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironment) {
|
||||
if ( name.getText().equals("DTYPE") ) {
|
||||
return name;
|
||||
}
|
||||
|
||||
return Identifier.toIdentifier(makeCleanIdentifier("c_" + name.getText()), name.isQuoted());
|
||||
}
|
||||
|
||||
private String makeCleanIdentifier(String s) {
|
||||
return s.substring(0, Math.min(s.length(), 63)).toLowerCase();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||
*/
|
||||
package org.hibernate.test.namingstrategy.ejb3joincolumn;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.Locale;
|
||||
|
||||
import org.hibernate.boot.Metadata;
|
||||
import org.hibernate.boot.MetadataBuilder;
|
||||
import org.hibernate.boot.MetadataSources;
|
||||
import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl;
|
||||
import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||
import org.hibernate.boot.spi.MetadataImplementor;
|
||||
import org.hibernate.cfg.Environment;
|
||||
import org.hibernate.mapping.Column;
|
||||
import org.hibernate.mapping.PersistentClass;
|
||||
import org.hibernate.mapping.Property;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* Tests {@link org.hibernate.cfg.Ejb3JoinColumn} and {@link org.hibernate.boot.model.naming.PhysicalNamingStrategy}
|
||||
* interaction
|
||||
*
|
||||
* @author Anton Wimmer
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class Tests extends BaseUnitTestCase {
|
||||
@Test
|
||||
@TestForIssue( jiraKey = "HHH-9961" )
|
||||
public void testJpaJoinColumnPhysicalNaming() {
|
||||
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder()
|
||||
.applySettings( Environment.getProperties() )
|
||||
.build();
|
||||
try {
|
||||
final MetadataSources metadataSources = new MetadataSources( ssr );
|
||||
metadataSources.addAnnotatedClass( Language.class );
|
||||
|
||||
final MetadataBuilder metadataBuilder = metadataSources.getMetadataBuilder();
|
||||
metadataBuilder.applyImplicitNamingStrategy( ImplicitNamingStrategyJpaCompliantImpl.INSTANCE );
|
||||
metadataBuilder.applyPhysicalNamingStrategy( PhysicalNamingStrategyImpl.INSTANCE );
|
||||
|
||||
final Metadata metadata = metadataBuilder.build();
|
||||
( ( MetadataImplementor) metadata ).validate();
|
||||
|
||||
final PersistentClass languageBinding = metadata.getEntityBinding( Language.class.getName() );
|
||||
final Property property = languageBinding.getProperty( "fallBack" );
|
||||
Iterator itr = property.getValue().getColumnIterator();
|
||||
assertTrue( itr.hasNext() );
|
||||
final Column column = (Column) itr.next();
|
||||
assertFalse( itr.hasNext() );
|
||||
|
||||
assertEquals( "C_FALLBACK_ID", column.getName().toUpperCase( Locale.ROOT ) );
|
||||
}
|
||||
finally {
|
||||
StandardServiceRegistryBuilder.destroy( ssr );
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue