From 2c1b7ca5378445615b0bd615697d36d8ea762d06 Mon Sep 17 00:00:00 2001 From: Steve Ebersole Date: Wed, 19 Aug 2015 11:57:24 -0500 Subject: [PATCH] HHH-9908 - Regression in naming collection join tables --- .../ImplicitNamingStrategyLegacyHbmImpl.java | 14 ++++ .../CollectionJoinTableNamingTest.java | 77 ++++++++++++++----- 2 files changed, 71 insertions(+), 20 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/naming/ImplicitNamingStrategyLegacyHbmImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/model/naming/ImplicitNamingStrategyLegacyHbmImpl.java index f027c79651..8410b1884a 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/naming/ImplicitNamingStrategyLegacyHbmImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/naming/ImplicitNamingStrategyLegacyHbmImpl.java @@ -42,4 +42,18 @@ public class ImplicitNamingStrategyLegacyHbmImpl extends ImplicitNamingStrategyJ return super.determineJoinColumnName( source ); } + + + @Override + public Identifier determineJoinTableName(ImplicitJoinTableNameSource source) { + if ( source.getAssociationOwningAttributePath() != null ) { + final String name = source.getOwningPhysicalTableName() + + '_' + + transformAttributePath( source.getAssociationOwningAttributePath() ); + + return toIdentifier( name, source.getBuildingContext() ); + } + + return super.determineJoinTableName( source ); + } } diff --git a/hibernate-core/src/test/java/org/hibernate/test/namingstrategy/collectionJoinTableNaming/CollectionJoinTableNamingTest.java b/hibernate-core/src/test/java/org/hibernate/test/namingstrategy/collectionJoinTableNaming/CollectionJoinTableNamingTest.java index 347219e955..6b4816d945 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/namingstrategy/collectionJoinTableNaming/CollectionJoinTableNamingTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/namingstrategy/collectionJoinTableNaming/CollectionJoinTableNamingTest.java @@ -36,9 +36,12 @@ import javax.persistence.OrderColumn; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; -import org.hibernate.cfg.Configuration; -import org.hibernate.cfg.EJB3NamingStrategy; -import org.hibernate.cfg.ImprovedNamingStrategy; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl; +import org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl; +import org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl; +import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.mapping.Collection; import org.hibernate.mapping.Column; import org.hibernate.tool.hbm2ddl.SchemaExport; @@ -50,7 +53,6 @@ import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; /** * @author Steve Ebersole @@ -59,18 +61,47 @@ import static org.junit.Assert.assertTrue; public class CollectionJoinTableNamingTest extends BaseUnitTestCase { @Test @TestForIssue( jiraKey = "HHH-9908" ) - public void testCollectionJoinTableNamingLegacyStrategy() { - Configuration cfg = new Configuration(); - cfg.setNamingStrategy( ImprovedNamingStrategy.INSTANCE ); + public void testCollectionJoinTableNamingBase() { + // really the same as the JPA compliant tests; here we just pick up the default ImplicitNamingStrategy + final MetadataSources metadataSources = new MetadataSources(); + metadataSources.addAnnotatedClass( Input.class ); + metadataSources.addAnnotatedClass( Ptx.class ); - cfg.addAnnotatedClass( Input.class ); - cfg.addAnnotatedClass( Ptx.class ); - cfg.buildMappings(); + final Metadata metadata = metadataSources.getMetadataBuilder() + .build(); - Collection inputs1Mapping = cfg.getCollectionMapping( Ptx.class.getName() + ".inputs1" ); + assertSameTableUsed( metadata ); + } + + @Test + @TestForIssue( jiraKey = "HHH-9908" ) + public void testCollectionJoinTableNamingLegacyJpaStrategy() { + final MetadataSources metadataSources = new MetadataSources(); + metadataSources.addAnnotatedClass( Input.class ); + metadataSources.addAnnotatedClass( Ptx.class ); + + final Metadata metadata = metadataSources.getMetadataBuilder() + .applyImplicitNamingStrategy( ImplicitNamingStrategyLegacyJpaImpl.INSTANCE ) + .build(); + + assertSameTableUsed( metadata ); + } + + @Test + @TestForIssue( jiraKey = "HHH-9908" ) + public void testCollectionJoinTableNamingLegacyHbmStrategy() { + final MetadataSources metadataSources = new MetadataSources(); + metadataSources.addAnnotatedClass( Input.class ); + metadataSources.addAnnotatedClass( Ptx.class ); + + final Metadata metadata = metadataSources.getMetadataBuilder() + .applyImplicitNamingStrategy( ImplicitNamingStrategyLegacyHbmImpl.INSTANCE ) + .build(); + + Collection inputs1Mapping = metadata.getCollectionBinding( Ptx.class.getName() + ".inputs1" ); assertEquals( "ptx_inputs1", inputs1Mapping.getCollectionTable().getName() ); - Collection inputs2Mapping = cfg.getCollectionMapping( Ptx.class.getName() + ".inputs2" ); + Collection inputs2Mapping = metadata.getCollectionBinding( Ptx.class.getName() + ".inputs2" ); assertEquals( "ptx_inputs2", inputs2Mapping.getCollectionTable().getName() ); } @@ -79,22 +110,28 @@ public class CollectionJoinTableNamingTest extends BaseUnitTestCase { public void testCollectionJoinTableNamingJpaCompliantStrategy() { // Even in 4.3, with JPA compliant naming, Hibernate creates an unusable table... - Configuration cfg = new Configuration(); - cfg.setNamingStrategy( EJB3NamingStrategy.INSTANCE ); + final MetadataSources metadataSources = new MetadataSources(); + metadataSources.addAnnotatedClass( Input.class ); + metadataSources.addAnnotatedClass( Ptx.class ); - cfg.addAnnotatedClass( Input.class ); - cfg.addAnnotatedClass( Ptx.class ); - cfg.buildMappings(); + final Metadata metadata = metadataSources.getMetadataBuilder() + .applyImplicitNamingStrategy( ImplicitNamingStrategyJpaCompliantImpl.INSTANCE ) + .build(); - Collection inputs1Mapping = cfg.getCollectionMapping( Ptx.class.getName() + ".inputs1" ); + assertSameTableUsed( metadata ); + } + + private void assertSameTableUsed(Metadata metadata) { + Collection inputs1Mapping = metadata.getCollectionBinding( Ptx.class.getName() + ".inputs1" ); assertEquals( "ptx_input", inputs1Mapping.getCollectionTable().getName() ); - Collection inputs2Mapping = cfg.getCollectionMapping( Ptx.class.getName() + ".inputs2" ); + Collection inputs2Mapping = metadata.getCollectionBinding( Ptx.class.getName() + ".inputs2" ); assertEquals( "ptx_input", inputs2Mapping.getCollectionTable().getName() ); assertSame( inputs1Mapping.getCollectionTable(), inputs2Mapping.getCollectionTable() ); - new SchemaExport( cfg ).create( true, false ); + // NOTE : here so that tester can more easily see the produced table. It is only dumped to stdout + new SchemaExport( (MetadataImplementor) metadata ).create( true, false ); for ( int i = 0; i < inputs1Mapping.getCollectionTable().getColumnSpan(); i++ ) { final Column column = inputs1Mapping.getCollectionTable().getColumn( i );