HHH-8737 throw MappingException for constraint with non-existent

column
This commit is contained in:
Brett Meyer 2014-02-17 15:03:28 -05:00
parent ea4812b046
commit e84ed199e3
5 changed files with 35 additions and 27 deletions

View File

@ -23,6 +23,8 @@
*/ */
package org.hibernate.metamodel.internal; package org.hibernate.metamodel.internal;
import static org.hibernate.engine.spi.SyntheticAttributeHelper.SYNTHETIC_COMPOSITE_ID_ATTRIBUTE_NAME;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
@ -37,6 +39,7 @@ import java.util.Set;
import org.hibernate.AssertionFailure; import org.hibernate.AssertionFailure;
import org.hibernate.EntityMode; import org.hibernate.EntityMode;
import org.hibernate.FetchMode; import org.hibernate.FetchMode;
import org.hibernate.MappingException;
import org.hibernate.MultiTenancyStrategy; import org.hibernate.MultiTenancyStrategy;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.AvailableSettings;
@ -163,8 +166,6 @@ import org.hibernate.tuple.entity.EntityTuplizer;
import org.hibernate.type.ForeignKeyDirection; import org.hibernate.type.ForeignKeyDirection;
import org.hibernate.type.Type; import org.hibernate.type.Type;
import static org.hibernate.engine.spi.SyntheticAttributeHelper.SYNTHETIC_COMPOSITE_ID_ATTRIBUTE_NAME;
/** /**
* The common binder shared between annotations and {@code hbm.xml} processing. * The common binder shared between annotations and {@code hbm.xml} processing.
* *
@ -1119,28 +1120,23 @@ public class Binder implements HelperContext {
final EntityBinding entityBinding = bindingContextContext.getEntityBinding(); final EntityBinding entityBinding = bindingContextContext.getEntityBinding();
final EntitySource entitySource = bindingContextContext.getEntitySource(); final EntitySource entitySource = bindingContextContext.getEntitySource();
for ( final ConstraintSource constraintSource : entitySource.getConstraints() ) { for ( final ConstraintSource constraintSource : entitySource.getConstraints() ) {
if ( UniqueConstraintSource.class.isInstance( constraintSource ) ) { final TableSpecification table = findConstraintTable( entityBinding, constraintSource.getTableName() );
final UniqueConstraintSource uniqueConstraintSource = (UniqueConstraintSource) constraintSource; final List<Column> columns = new ArrayList<Column>();
for ( final String columnName : constraintSource.columnNames() ) {
final TableSpecification table = findConstraintTable( entityBinding, constraintSource.getTableName() ); final Column column = tableHelper.locateColumn( table, columnName,
new ColumnNamingStrategyHelper( null, false ) );
final List<Column> columns = new ArrayList<Column>(); if (column == null) {
for ( final String columnName : uniqueConstraintSource.columnNames() ) { throw new MappingException( "While creating a constraint, could not find column "
columns.add( tableHelper.locateOrCreateColumn( table, columnName, + columnName + " on table "+ table.getLogicalName().getText() );
new ColumnNamingStrategyHelper( null, false ) ) );
} }
columns.add( column );
}
if ( UniqueConstraintSource.class.isInstance( constraintSource ) ) {
tableHelper.createUniqueKey( table, columns, constraintSource.name() ); tableHelper.createUniqueKey( table, columns, constraintSource.name() );
} }
else if ( IndexConstraintSource.class.isInstance( constraintSource ) ) { else if ( IndexConstraintSource.class.isInstance( constraintSource ) ) {
final IndexConstraintSource indexConstraintSource = (IndexConstraintSource) constraintSource; final IndexConstraintSource indexConstraintSource = (IndexConstraintSource) constraintSource;
final TableSpecification table = findConstraintTable( entityBinding, constraintSource.getTableName() );
final List<Column> columns = new ArrayList<Column>();
for ( final String columnName : indexConstraintSource.columnNames() ) {
columns.add( tableHelper.locateOrCreateColumn( table, columnName,
new ColumnNamingStrategyHelper( null, false ) ) );
}
tableHelper.createIndex( table, columns, indexConstraintSource.name(), tableHelper.createIndex( table, columns, indexConstraintSource.name(),
indexConstraintSource.isUnique() ); indexConstraintSource.isUnique() );
} }

View File

@ -24,7 +24,6 @@
package org.hibernate.metamodel.internal; package org.hibernate.metamodel.internal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import org.hibernate.cfg.NamingStrategy; import org.hibernate.cfg.NamingStrategy;

View File

@ -149,6 +149,22 @@ public class TableHelper {
return table.locateOrCreateColumn( resolvedColumnName ); return table.locateOrCreateColumn( resolvedColumnName );
} }
public Column locateColumn(
final TableSpecification table,
final String columnName,
final ObjectNameNormalizer.NamingStrategyHelper namingStrategyHelper) {
if ( columnName == null && namingStrategyHelper == null ) {
throw bindingContext().makeMappingException(
"Cannot resolve name for column because no name was specified and namingStrategyHelper is null."
);
}
final String resolvedColumnName = normalizeDatabaseIdentifier(
columnName,
namingStrategyHelper
);
return table.locateColumn( resolvedColumnName );
}
public Column locateOrCreateColumn( public Column locateOrCreateColumn(
final TableSpecification table, final TableSpecification table,
final ColumnSource columnSource, final ColumnSource columnSource,

View File

@ -11,7 +11,7 @@ import javax.persistence.ManyToMany;
import javax.persistence.Table; import javax.persistence.Table;
@Entity @Entity
@Table(indexes = @Index(name="`titleindex`", columnList = "title")) @Table(indexes = @Index(name="`titleindex`", columnList = "`title`"))
public class Bug public class Bug
{ {
@Id @Id

View File

@ -7,11 +7,10 @@ import javax.persistence.Id;
import javax.persistence.Table; import javax.persistence.Table;
import javax.persistence.UniqueConstraint; import javax.persistence.UniqueConstraint;
import org.hibernate.AnnotationException; import org.hibernate.MappingException;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Configuration;
import org.hibernate.service.spi.ServiceRegistryImplementor; import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.TestForIssue; import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseUnitTestCase; import org.hibernate.testing.junit4.BaseUnitTestCase;
import org.junit.Test; import org.junit.Test;
@ -22,9 +21,8 @@ import org.junit.Test;
*/ */
public class UniqueConstraintValidationTest extends BaseUnitTestCase { public class UniqueConstraintValidationTest extends BaseUnitTestCase {
@Test(expected = AnnotationException.class) @Test(expected = MappingException.class)
@TestForIssue(jiraKey = "HHH-4084") @TestForIssue(jiraKey = "HHH-4084")
@FailureExpectedWithNewMetamodel
public void testUniqueConstraintWithEmptyColumnName() { public void testUniqueConstraintWithEmptyColumnName() {
buildSessionFactory(EmptyColumnNameEntity.class); buildSessionFactory(EmptyColumnNameEntity.class);
} }
@ -34,8 +32,7 @@ public class UniqueConstraintValidationTest extends BaseUnitTestCase {
buildSessionFactory(EmptyColumnNameListEntity.class); buildSessionFactory(EmptyColumnNameListEntity.class);
} }
@Test(expected = AnnotationException.class) @Test(expected = MappingException.class)
@FailureExpectedWithNewMetamodel
public void testUniqueConstraintWithNotExistsColumnName() { public void testUniqueConstraintWithNotExistsColumnName() {
buildSessionFactory(NotExistsColumnEntity.class); buildSessionFactory(NotExistsColumnEntity.class);
} }