HHH-10106 - Include source entity name and table name (attribute name too ideally) for associations referencing unmapped classes
(cherry picked from commit f0fa15b247
)
This commit is contained in:
parent
5c3ea67111
commit
f799d3f85e
|
@ -828,6 +828,11 @@ public abstract class CollectionBinder {
|
|||
if ( debugEnabled ) {
|
||||
LOG.debugf( "Binding a OneToMany: %s.%s through a foreign key", propertyHolder.getEntityName(), propertyName );
|
||||
}
|
||||
if ( buildingContext == null ) {
|
||||
throw new AssertionFailure(
|
||||
"CollectionSecondPass for oneToMany should not be called with null mappings"
|
||||
);
|
||||
}
|
||||
org.hibernate.mapping.OneToMany oneToMany = new org.hibernate.mapping.OneToMany( buildingContext.getMetadataCollector(), collection.getOwner() );
|
||||
collection.setElement( oneToMany );
|
||||
oneToMany.setReferencedEntityName( collectionType.getName() );
|
||||
|
@ -845,16 +850,11 @@ public abstract class CollectionBinder {
|
|||
collection.setOrderBy( orderByFragment );
|
||||
}
|
||||
}
|
||||
|
||||
if ( buildingContext == null ) {
|
||||
throw new AssertionFailure(
|
||||
"CollectionSecondPass for oneToMany should not be called with null mappings"
|
||||
);
|
||||
}
|
||||
Map<String, Join> joins = buildingContext.getMetadataCollector().getJoins( assocClass );
|
||||
if ( associatedClass == null ) {
|
||||
throw new MappingException(
|
||||
"Association references unmapped class: " + assocClass
|
||||
String.format("Association [%s] for entity [%s] references unmapped class [%s]",
|
||||
propertyName, propertyHolder.getClassName(), assocClass)
|
||||
);
|
||||
}
|
||||
oneToMany.setAssociatedClass( associatedClass );
|
||||
|
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* 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.cfg.annotations;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.MappingException;
|
||||
import org.hibernate.annotations.common.reflection.XClass;
|
||||
import org.hibernate.boot.spi.InFlightMetadataCollector;
|
||||
import org.hibernate.boot.spi.MetadataBuildingContext;
|
||||
import org.hibernate.cfg.PropertyHolder;
|
||||
import org.hibernate.mapping.Collection;
|
||||
import org.hibernate.mapping.PersistentClass;
|
||||
import org.hibernate.mapping.Table;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.mockito.Mockito;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
/**
|
||||
* Test for HHH-10106
|
||||
*
|
||||
* @author Vyacheslav Rarata
|
||||
*/
|
||||
public class CollectionBinderTest extends BaseUnitTestCase {
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-10106")
|
||||
public void testAssociatedClassException() throws SQLException {
|
||||
final Collection collection = mock(Collection.class);
|
||||
final Map persistentClasses = mock(Map.class);
|
||||
final XClass collectionType = mock(XClass.class);
|
||||
final MetadataBuildingContext buildingContext = mock(MetadataBuildingContext.class);
|
||||
final InFlightMetadataCollector inFly = mock(InFlightMetadataCollector.class);
|
||||
final PersistentClass persistentClass = mock(PersistentClass.class);
|
||||
final Table table = mock(Table.class);
|
||||
|
||||
when(buildingContext.getMetadataCollector()).thenReturn(inFly);
|
||||
when(persistentClasses.get(null)).thenReturn(null);
|
||||
when(collection.getOwner()).thenReturn(persistentClass);
|
||||
when(collectionType.getName()).thenReturn("List");
|
||||
when(persistentClass.getTable()).thenReturn(table);
|
||||
when(table.getName()).thenReturn("Hibernate");
|
||||
|
||||
CollectionBinder collectionBinder = new CollectionBinder(false) {
|
||||
@Override
|
||||
protected Collection createCollection(PersistentClass persistentClass) {
|
||||
return null;
|
||||
}
|
||||
|
||||
{
|
||||
final PropertyHolder propertyHolder = Mockito.mock(PropertyHolder.class);
|
||||
when(propertyHolder.getClassName()).thenReturn( CollectionBinderTest.class.getSimpleName() );
|
||||
this.propertyName = "abc";
|
||||
this.propertyHolder = propertyHolder;
|
||||
}
|
||||
};
|
||||
|
||||
String expectMessage = "Association [abc] for entity [CollectionBinderTest] references unmapped class [List]";
|
||||
try {
|
||||
collectionBinder.bindOneToManySecondPass(collection, persistentClasses, null, collectionType, false, false, buildingContext, null);
|
||||
} catch (MappingException e) {
|
||||
assertEquals(expectMessage, e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue