/* * 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; import java.util.Iterator; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.model.naming.EntityNaming; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.ImplicitJoinColumnNameSource; import org.hibernate.boot.model.naming.ImplicitJoinTableNameSource; 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.mapping.Collection; import org.hibernate.mapping.ForeignKey; import org.hibernate.mapping.PersistentClass; import org.hibernate.testing.AfterClassOnce; import org.hibernate.testing.BeforeClassOnce; 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.assertTrue; public class FullyQualifiedEntityNameNamingStrategyTest extends BaseUnitTestCase { private StandardServiceRegistry ssr; private MetadataImplementor metadata; @BeforeClassOnce public void setUp() { ssr = new StandardServiceRegistryBuilder().build(); metadata = (MetadataImplementor) new MetadataSources( ssr ) .addAnnotatedClass( Category.class ) .addAnnotatedClass( Item.class ) .addAnnotatedClass( Workflow.class ) .getMetadataBuilder() .applyImplicitNamingStrategy( new MyNamingStrategy() ) .build(); } @AfterClassOnce public void tearDown() { if ( ssr != null ) { StandardServiceRegistryBuilder.destroy( ssr ); } } @Test @TestForIssue(jiraKey = "HHH-4312") public void testEntityTable() throws Exception { final PersistentClass classMapping = metadata.getEntityBinding( Workflow.class.getName() ); final String expectedTableName = transformEntityName( Workflow.class.getName() ); assertEquals( expectedTableName, classMapping.getTable().getName() ); } @Test @TestForIssue(jiraKey = "HHH-9327") public void testElementCollectionTable() { final Collection collectionMapping = metadata.getCollectionBinding( Workflow.class.getName() + ".localized" ); final String expectedTableName = transformEntityName( Workflow.class.getName() ) + "_localized"; assertEquals( expectedTableName, collectionMapping.getCollectionTable().getName() ); } @Test @TestForIssue(jiraKey = "HHH-9327") public void testManyToManyCollectionTable() { final Collection collectionMapping = metadata.getCollectionBinding( Category.class.getName() + "." + "items" ); final String expectedTableName = transformEntityName( Category.class.getName() ) + "_" + transformEntityName( Item.class.getName() ); assertEquals( expectedTableName, collectionMapping.getCollectionTable().getName() ); } @Test @TestForIssue( jiraKey = "HHH-9327") public void testManyToManyForeignKeys() { final Collection ownerCollectionMapping = metadata.getCollectionBinding( Category.class.getName() + "." + "items" ); final String expectedOwnerFK = transformEntityName( Category.class.getName() ) + "_id"; final String expectedInverseFK = transformEntityName( Item.class.getName() ) + "_items_id"; boolean ownerFKFound = false; boolean inverseFKFound = false; for ( Iterator it = ownerCollectionMapping.getCollectionTable().getForeignKeyIterator(); it.hasNext(); ) { final String fkColumnName = ( (ForeignKey) it.next() ).getColumn( 0 ).getName(); if ( expectedOwnerFK.equals( fkColumnName ) ) { ownerFKFound = true; } else if ( expectedInverseFK.equals( fkColumnName ) ) { inverseFKFound = true; } } assertTrue( ownerFKFound ); assertTrue( inverseFKFound ); } static String transformEntityName(String entityName) { return entityName.replaceAll( "\\.", "_" ); } public static class MyNamingStrategy extends ImplicitNamingStrategyJpaCompliantImpl { private static final long serialVersionUID = -5713413771290957530L; @Override protected String transformEntityName(EntityNaming entityNaming) { if ( entityNaming.getClassName() != null ) { return FullyQualifiedEntityNameNamingStrategyTest.transformEntityName( entityNaming.getClassName() ); } return super.transformEntityName( entityNaming ); } @Override public Identifier determineJoinTableName(ImplicitJoinTableNameSource source) { final String ownerPortion = transformEntityName( source.getOwningEntityNaming() ); final String ownedPortion; if ( source.getNonOwningEntityNaming() != null ) { ownedPortion = transformEntityName( source.getNonOwningEntityNaming() ); } else { ownedPortion = transformAttributePath( source.getAssociationOwningAttributePath() ); } return toIdentifier( ownerPortion + "_" + ownedPortion, source.getBuildingContext() ); } @Override public Identifier determineJoinColumnName(ImplicitJoinColumnNameSource source) { final String entityPortion = transformEntityName( source.getEntityNaming() ); final String name; if ( source.getAttributePath() == null ) { name = entityPortion + "_" + source.getReferencedColumnName(); } else { name = entityPortion + "_" + transformAttributePath( source.getAttributePath() ) + "_" + source.getReferencedColumnName(); } return toIdentifier( name, source.getBuildingContext() ); } } }