/* * 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.dialect.unique; import java.util.Iterator; import org.hibernate.boot.Metadata; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.mapping.UniqueKey; /** * The default UniqueDelegate implementation for most dialects. Uses * separate create/alter statements to apply uniqueness to a column. * * @author Brett Meyer */ public class DefaultUniqueDelegate implements UniqueDelegate { protected final Dialect dialect; /** * Constructs DefaultUniqueDelegate * * @param dialect The dialect for which we are handling unique constraints */ public DefaultUniqueDelegate( Dialect dialect ) { this.dialect = dialect; } // legacy model ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @Override public String getColumnDefinitionUniquenessFragment(org.hibernate.mapping.Column column) { return ""; } @Override public String getTableCreationUniqueConstraintsFragment(org.hibernate.mapping.Table table) { return ""; } @Override public String getAlterTableToAddUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata) { final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment(); final String tableName = jdbcEnvironment.getQualifiedObjectNameFormatter().format( uniqueKey.getTable().getQualifiedTableName(), dialect ); final String constraintName = dialect.quote( uniqueKey.getName() ); return dialect.getAlterTableString( tableName ) + " add constraint " + constraintName + " " + uniqueConstraintSql( uniqueKey ); } protected String uniqueConstraintSql(UniqueKey uniqueKey) { final StringBuilder sb = new StringBuilder(); sb.append( "unique (" ); final Iterator<org.hibernate.mapping.Column> columnIterator = uniqueKey.columnIterator(); while ( columnIterator.hasNext() ) { final org.hibernate.mapping.Column column = columnIterator.next(); sb.append( column.getQuotedName( dialect ) ); if ( uniqueKey.getColumnOrderMap().containsKey( column ) ) { sb.append( " " ).append( uniqueKey.getColumnOrderMap().get( column ) ); } if ( columnIterator.hasNext() ) { sb.append( ", " ); } } return sb.append( ')' ).toString(); } @Override public String getAlterTableToDropUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata) { final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment(); final String tableName = jdbcEnvironment.getQualifiedObjectNameFormatter().format( uniqueKey.getTable().getQualifiedTableName(), dialect ); final StringBuilder buf = new StringBuilder( dialect.getAlterTableString(tableName) ); buf.append( getDropUnique() ); if ( dialect.supportsIfExistsBeforeConstraintName() ) { buf.append( "if exists " ); } buf.append( dialect.quote( uniqueKey.getName() ) ); if ( dialect.supportsIfExistsAfterConstraintName() ) { buf.append( " if exists" ); } return buf.toString(); } protected String getDropUnique(){ return " drop constraint "; } }