Skip to content

Commit 923ecb8

Browse files
committed
HHH-9961 - Ejb3JoinColumn does not use PhysicalNamingStrategy
1 parent c1af643 commit 923ecb8

File tree

4 files changed

+185
-13
lines changed

4 files changed

+185
-13
lines changed

hibernate-core/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.hibernate.annotations.common.reflection.XClass;
2424
import org.hibernate.boot.model.naming.EntityNaming;
2525
import org.hibernate.boot.model.naming.Identifier;
26+
import org.hibernate.boot.model.naming.ImplicitBasicColumnNameSource;
2627
import org.hibernate.boot.model.naming.ImplicitJoinColumnNameSource;
2728
import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
2829
import org.hibernate.boot.model.naming.ImplicitPrimaryKeyJoinColumnNameSource;
@@ -495,7 +496,7 @@ private String buildDefaultColumnName(final PersistentClass referencedEntity, fi
495496
final ImplicitNamingStrategy implicitNamingStrategy = getBuildingContext().getBuildingOptions().getImplicitNamingStrategy();
496497
final PhysicalNamingStrategy physicalNamingStrategy = getBuildingContext().getBuildingOptions().getPhysicalNamingStrategy();
497498

498-
String columnName;
499+
Identifier columnIdentifier;
499500
boolean mappedBySide = mappedByTableName != null || mappedByPropertyName != null;
500501
boolean ownerSide = getPropertyName() != null;
501502

@@ -505,8 +506,6 @@ private String buildDefaultColumnName(final PersistentClass referencedEntity, fi
505506
: logicalReferencedColumn;
506507

507508
if ( mappedBySide ) {
508-
final Identifier columnIdentifier;
509-
510509
// NOTE : While it is completely misleading here to allow for the combination
511510
// of a "JPA ElementCollection" to be mappedBy, the code that uses this
512511
// class relies on this behavior for handling the inverse side of
@@ -579,7 +578,8 @@ public Identifier getReferencedColumnName() {
579578
return null;
580579
}
581580

582-
final PersistentClass mappedByEntityBinding = getBuildingContext().getMetadataCollector().getEntityBinding( mappedByEntityName );
581+
final PersistentClass mappedByEntityBinding = getBuildingContext().getMetadataCollector()
582+
.getEntityBinding( mappedByEntityName );
583583
final Property mappedByProperty = mappedByEntityBinding.getProperty( mappedByPropertyName );
584584
final SimpleValue value = (SimpleValue) mappedByProperty.getValue();
585585
final Iterator<Selectable> selectableValues = value.getColumnIterator();
@@ -626,10 +626,9 @@ public MetadataBuildingContext getBuildingContext() {
626626
}
627627
);
628628

629-
columnName = columnIdentifier.render();
630629
//one element was quoted so we quote
631630
if ( isRefColumnQuoted || StringHelper.isQuoted( mappedByTableName ) ) {
632-
columnName = StringHelper.quote( columnName );
631+
columnIdentifier = Identifier.quote( columnIdentifier );
633632
}
634633
}
635634
else if ( ownerSide ) {
@@ -647,7 +646,8 @@ else if ( getPropertyHolder().isEntity() ) {
647646
else {
648647
implicitNamingNature = ImplicitJoinColumnNameSource.Nature.ENTITY_COLLECTION;
649648
}
650-
Identifier columnNameIdentifier = getBuildingContext().getBuildingOptions().getImplicitNamingStrategy().determineJoinColumnName(
649+
650+
columnIdentifier = getBuildingContext().getBuildingOptions().getImplicitNamingStrategy().determineJoinColumnName(
651651
new ImplicitJoinColumnNameSource() {
652652
private final EntityNaming entityNaming = new EntityNaming() {
653653
@Override
@@ -705,19 +705,19 @@ public MetadataBuildingContext getBuildingContext() {
705705
}
706706
}
707707
);
708+
708709
//one element was quoted so we quote
709710
if ( isRefColumnQuoted || StringHelper.isQuoted( logicalTableName ) ) {
710-
Identifier.quote( columnNameIdentifier );
711+
columnIdentifier = Identifier.quote( columnIdentifier );
711712
}
712-
columnName = columnNameIdentifier.render();
713713
}
714714
else {
715715
final Identifier logicalTableName = database.toIdentifier(
716716
getBuildingContext().getMetadataCollector().getLogicalTableName( referencedEntity.getTable() )
717717
);
718718

719719
// is an intra-entity hierarchy table join so copy the name by default
720-
Identifier columnIdentifier = implicitNamingStrategy.determinePrimaryKeyJoinColumnName(
720+
columnIdentifier = implicitNamingStrategy.determinePrimaryKeyJoinColumnName(
721721
new ImplicitPrimaryKeyJoinColumnNameSource() {
722722
@Override
723723
public MetadataBuildingContext getBuildingContext() {
@@ -739,11 +739,10 @@ public Identifier getReferencedPrimaryKeyColumnName() {
739739
if ( !columnIdentifier.isQuoted() && ( isRefColumnQuoted || logicalTableName.isQuoted() ) ) {
740740
columnIdentifier = Identifier.quote( columnIdentifier );
741741
}
742-
743-
columnName = columnIdentifier.render();
744742
}
745743

746-
return columnName;
744+
return physicalNamingStrategy.toPhysicalColumnName( columnIdentifier, database.getJdbcEnvironment() )
745+
.render( database.getJdbcEnvironment().getDialect() );
747746
}
748747

749748
/**
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
5+
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
6+
*/
7+
package org.hibernate.test.namingstrategy.ejb3joincolumn;
8+
9+
import javax.persistence.Access;
10+
import javax.persistence.AccessType;
11+
import javax.persistence.Entity;
12+
import javax.persistence.Id;
13+
import javax.persistence.JoinColumn;
14+
import javax.persistence.ManyToOne;
15+
16+
/**
17+
* @author Anton Wimmer
18+
* @author Steve Ebersole
19+
*/
20+
@Entity
21+
//@Immutable
22+
//@Cacheable
23+
//@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
24+
//@SuppressWarnings("serial")
25+
public class Language {
26+
27+
@Id
28+
@Access(AccessType.PROPERTY)
29+
private Long id = null;
30+
31+
public Long getId() {
32+
return id;
33+
}
34+
35+
public void setId(Long id) {
36+
this.id = id;
37+
}
38+
39+
// @Column(unique = true)
40+
// @Lob
41+
// @Type(type = "org.hibernate.type.TextType")
42+
private String name;
43+
44+
@ManyToOne(optional = true)
45+
@JoinColumn
46+
private Language fallBack;
47+
48+
public String getName() {
49+
return name;
50+
}
51+
52+
public void setName(String name) {
53+
this.name = name;
54+
}
55+
56+
public Language getFallBack() {
57+
return fallBack;
58+
}
59+
60+
public void setFallBack(Language fallBack) {
61+
this.fallBack = fallBack;
62+
}
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
5+
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
6+
*/
7+
package org.hibernate.test.namingstrategy.ejb3joincolumn;
8+
9+
import org.hibernate.boot.model.naming.Identifier;
10+
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
11+
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
12+
13+
/**
14+
* @author Anton Wimmer
15+
* @author Steve Ebersole
16+
*/
17+
public class PhysicalNamingStrategyImpl extends PhysicalNamingStrategyStandardImpl {
18+
/**
19+
* Singleton access
20+
*/
21+
public static final PhysicalNamingStrategyImpl INSTANCE = new PhysicalNamingStrategyImpl();
22+
23+
@Override
24+
public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) {
25+
return Identifier.toIdentifier(makeCleanIdentifier("tbl_" + name.getText()), name.isQuoted());
26+
}
27+
28+
@Override
29+
public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironment) {
30+
if ( name.getText().equals("DTYPE") ) {
31+
return name;
32+
}
33+
34+
return Identifier.toIdentifier(makeCleanIdentifier("c_" + name.getText()), name.isQuoted());
35+
}
36+
37+
private String makeCleanIdentifier(String s) {
38+
return s.substring(0, Math.min(s.length(), 63)).toLowerCase();
39+
}
40+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
5+
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
6+
*/
7+
package org.hibernate.test.namingstrategy.ejb3joincolumn;
8+
9+
import java.util.Iterator;
10+
import java.util.Locale;
11+
12+
import org.hibernate.boot.Metadata;
13+
import org.hibernate.boot.MetadataBuilder;
14+
import org.hibernate.boot.MetadataSources;
15+
import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl;
16+
import org.hibernate.boot.registry.StandardServiceRegistry;
17+
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
18+
import org.hibernate.boot.spi.MetadataImplementor;
19+
import org.hibernate.cfg.Environment;
20+
import org.hibernate.mapping.Column;
21+
import org.hibernate.mapping.PersistentClass;
22+
import org.hibernate.mapping.Property;
23+
24+
import org.hibernate.testing.TestForIssue;
25+
import org.hibernate.testing.junit4.BaseUnitTestCase;
26+
import org.junit.Test;
27+
28+
import static org.junit.Assert.assertEquals;
29+
import static org.junit.Assert.assertFalse;
30+
import static org.junit.Assert.assertTrue;
31+
32+
/**
33+
* Tests {@link org.hibernate.cfg.Ejb3JoinColumn} and {@link org.hibernate.boot.model.naming.PhysicalNamingStrategy}
34+
* interaction
35+
*
36+
* @author Anton Wimmer
37+
* @author Steve Ebersole
38+
*/
39+
public class Tests extends BaseUnitTestCase {
40+
@Test
41+
@TestForIssue( jiraKey = "HHH-9961" )
42+
public void testJpaJoinColumnPhysicalNaming() {
43+
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder()
44+
.applySettings( Environment.getProperties() )
45+
.build();
46+
try {
47+
final MetadataSources metadataSources = new MetadataSources( ssr );
48+
metadataSources.addAnnotatedClass( Language.class );
49+
50+
final MetadataBuilder metadataBuilder = metadataSources.getMetadataBuilder();
51+
metadataBuilder.applyImplicitNamingStrategy( ImplicitNamingStrategyJpaCompliantImpl.INSTANCE );
52+
metadataBuilder.applyPhysicalNamingStrategy( PhysicalNamingStrategyImpl.INSTANCE );
53+
54+
final Metadata metadata = metadataBuilder.build();
55+
( ( MetadataImplementor) metadata ).validate();
56+
57+
final PersistentClass languageBinding = metadata.getEntityBinding( Language.class.getName() );
58+
final Property property = languageBinding.getProperty( "fallBack" );
59+
Iterator itr = property.getValue().getColumnIterator();
60+
assertTrue( itr.hasNext() );
61+
final Column column = (Column) itr.next();
62+
assertFalse( itr.hasNext() );
63+
64+
assertEquals( "C_FALLBACK_ID", column.getName().toUpperCase( Locale.ROOT ) );
65+
}
66+
finally {
67+
StandardServiceRegistryBuilder.destroy( ssr );
68+
}
69+
}
70+
}

0 commit comments

Comments
 (0)