/* * 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.hbm.uk; import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.H2Dialect; import org.hibernate.dialect.unique.DefaultUniqueDelegate; import org.hibernate.dialect.unique.UniqueDelegate; import org.hibernate.mapping.Column; import org.hibernate.mapping.Table; import org.hibernate.mapping.UniqueKey; import org.hibernate.tool.schema.internal.SchemaCreatorImpl; import org.hibernate.tool.schema.internal.SchemaDropperImpl; import org.hibernate.testing.TestForIssue; import org.hibernate.testing.junit4.BaseUnitTestCase; import org.hibernate.test.hbm.index.JournalingSchemaToolingTarget; import org.junit.After; import org.junit.Before; import org.junit.Test; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertThat; /** * @author Steve Ebersole */ public class UniqueDelegateTest extends BaseUnitTestCase { private static int getColumnDefinitionUniquenessFragmentCallCount = 0; private static int getTableCreationUniqueConstraintsFragmentCallCount = 0; private static int getAlterTableToAddUniqueKeyCommandCallCount = 0; private static int getAlterTableToDropUniqueKeyCommandCallCount = 0; private StandardServiceRegistry ssr; @Before public void before() { ssr = new StandardServiceRegistryBuilder() .applySetting( AvailableSettings.DIALECT, MyDialect.class ) .build(); } @After public void after() { if ( ssr != null ) { StandardServiceRegistryBuilder.destroy( ssr ); } } @Test @TestForIssue( jiraKey = "HHH-10203" ) public void testUniqueDelegateConsulted() { final Metadata metadata = new MetadataSources( ssr ) .addResource( "org/hibernate/test/hbm/uk/person_unique.hbm.xml" ) .buildMetadata(); final JournalingSchemaToolingTarget target = new JournalingSchemaToolingTarget(); new SchemaCreatorImpl( ssr ).doCreation( metadata, false, target ); assertThat( getAlterTableToAddUniqueKeyCommandCallCount, equalTo( 1 ) ); assertThat( getColumnDefinitionUniquenessFragmentCallCount, equalTo( 1 ) ); assertThat( getTableCreationUniqueConstraintsFragmentCallCount, equalTo( 1 ) ); new SchemaDropperImpl( ssr ).doDrop( metadata, false, target ); // unique keys are not dropped explicitly assertThat( getAlterTableToAddUniqueKeyCommandCallCount, equalTo( 1 ) ); assertThat( getColumnDefinitionUniquenessFragmentCallCount, equalTo( 1 ) ); assertThat( getTableCreationUniqueConstraintsFragmentCallCount, equalTo( 1 ) ); } public static class MyDialect extends H2Dialect { private MyUniqueDelegate myUniqueDelegate; public MyDialect() { this.myUniqueDelegate = new MyUniqueDelegate( this ); } @Override public UniqueDelegate getUniqueDelegate() { return myUniqueDelegate; } } public static class MyUniqueDelegate extends DefaultUniqueDelegate { /** * Constructs DefaultUniqueDelegate * * @param dialect The dialect for which we are handling unique constraints */ public MyUniqueDelegate(Dialect dialect) { super( dialect ); } @Override public String getColumnDefinitionUniquenessFragment(Column column) { getColumnDefinitionUniquenessFragmentCallCount++; return super.getColumnDefinitionUniquenessFragment( column ); } @Override public String getTableCreationUniqueConstraintsFragment(Table table) { getTableCreationUniqueConstraintsFragmentCallCount++; return super.getTableCreationUniqueConstraintsFragment( table ); } @Override public String getAlterTableToAddUniqueKeyCommand( UniqueKey uniqueKey, Metadata metadata) { getAlterTableToAddUniqueKeyCommandCallCount++; return super.getAlterTableToAddUniqueKeyCommand( uniqueKey, metadata ); } @Override public String getAlterTableToDropUniqueKeyCommand( UniqueKey uniqueKey, Metadata metadata) { getAlterTableToDropUniqueKeyCommandCallCount++; return super.getAlterTableToDropUniqueKeyCommand( uniqueKey, metadata ); } } }