HHH-8737 throw MappingException for constraint with non-existent
column
This commit is contained in:
parent
ea4812b046
commit
e84ed199e3
|
@ -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() );
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue