Skip to content

Commit

Permalink
HHH-8026 Duplicate constraint names with unique=true
Browse files Browse the repository at this point in the history
  • Loading branch information
Brett Meyer committed Feb 27, 2013
1 parent 315dce1 commit d01ff32
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 7 deletions.
Expand Up @@ -1370,7 +1370,7 @@ protected void secondPassCompile() throws MappingException {
for ( UniqueConstraintHolder holder : uniqueConstraints ) {
uniqueIndexPerTable++;
final String keyName = StringHelper.isEmpty( holder.getName() )
? "key" + uniqueIndexPerTable
? "UK_" + table.getName() + "_" + uniqueIndexPerTable
: holder.getName();
buildUniqueKeyFromColumnNames( table, keyName, holder.getColumns() );
}
Expand Down
12 changes: 9 additions & 3 deletions hibernate-core/src/main/java/org/hibernate/mapping/Table.java
Expand Up @@ -394,6 +394,9 @@ public Iterator sqlAlterStrings(Dialect dialect, Mapping p, TableMetadata tableI

Iterator iter = getColumnIterator();
List results = new ArrayList();

int uniqueIndexInteger = 0;

while ( iter.hasNext() ) {
Column column = (Column) iter.next();

Expand All @@ -420,8 +423,9 @@ public Iterator sqlAlterStrings(Dialect dialect, Mapping p, TableMetadata tableI
}

if ( column.isUnique() ) {
uniqueIndexInteger++;
UniqueKey uk = getOrCreateUniqueKey(
column.getQuotedName( dialect ) + '_' );
"UK_" + name + "_" + uniqueIndexInteger);
uk.addColumn( column );
alter.append( dialect.getUniqueDelegate()
.applyUniqueToColumn( column ) );
Expand Down Expand Up @@ -490,6 +494,7 @@ public String sqlCreateString(Dialect dialect, Mapping p, String defaultCatalog,
}

Iterator iter = getColumnIterator();
int uniqueIndexInteger = 0;
while ( iter.hasNext() ) {
Column col = (Column) iter.next();

Expand Down Expand Up @@ -523,8 +528,9 @@ public String sqlCreateString(Dialect dialect, Mapping p, String defaultCatalog,
}

if ( col.isUnique() ) {
uniqueIndexInteger++;
UniqueKey uk = getOrCreateUniqueKey(
col.getQuotedName( dialect ) + '_' );
"uc_" + name + "_" + uniqueIndexInteger);
uk.addColumn( col );
buf.append( dialect.getUniqueDelegate()
.applyUniqueToColumn( col ) );
Expand Down Expand Up @@ -620,7 +626,7 @@ public UniqueKey addUniqueKey(UniqueKey uniqueKey) {
}

public UniqueKey createUniqueKey(List keyColumns) {
String keyName = "UK" + uniqueColumnString( keyColumns.iterator() );
String keyName = "UK_" + uniqueColumnString( keyColumns.iterator() );
UniqueKey uk = getOrCreateUniqueKey( keyName );
uk.addColumns( keyColumns.iterator() );
return uk;
Expand Down
@@ -1,23 +1,35 @@
package org.hibernate.test.annotations.uniqueconstraint;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;

import java.util.Iterator;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

import org.hibernate.JDBCException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.junit.Test;

/**
* @author Manuel Bernhardt <bernhardt.manuel@gmail.com>
*/
public class UniqueConstraintTest extends BaseCoreFunctionalTestCase {

protected Class[] getAnnotatedClasses() {
protected Class[] getAnnotatedClasses() {
return new Class[]{
Room.class,
Building.class,
House.class
House.class,
UniqueNoNameA.class,
UniqueNoNameB.class
};
}

Expand Down Expand Up @@ -52,5 +64,51 @@ public void testUniquenessConstraintWithSuperclassProperty() throws Exception {
tx.rollback();
s.close();
}

@Test
@TestForIssue( jiraKey = "HHH-8026" )
public void testUnNamedConstraints() {
Iterator<org.hibernate.mapping.Table> iterator = configuration().getTableMappings();
org.hibernate.mapping.Table tableA = null;
org.hibernate.mapping.Table tableB = null;
while( iterator.hasNext() ) {
org.hibernate.mapping.Table table = iterator.next();
if ( table.getName().equals( "UniqueNoNameA" ) ) {
tableA = table;
}
else if ( table.getName().equals( "UniqueNoNameB" ) ) {
tableB = table;
}
}

if ( tableA == null || tableB == null ) {
fail( "Could not find the expected tables." );
}

assertFalse( tableA.getUniqueKeyIterator().next().getName().equals(
tableB.getUniqueKeyIterator().next().getName() ) );
}

@Entity
@Table( name = "UniqueNoNameA",
uniqueConstraints = {@UniqueConstraint(columnNames={"name"})})
public static class UniqueNoNameA {
@Id
@GeneratedValue
public long id;

public String name;
}

@Entity
@Table( name = "UniqueNoNameB",
uniqueConstraints = {@UniqueConstraint(columnNames={"name"})})
public static class UniqueNoNameB {
@Id
@GeneratedValue
public long id;

public String name;
}

}

0 comments on commit d01ff32

Please sign in to comment.