HHH-7052 : Bind PluralAttributeKeyBinding

This commit is contained in:
Gail Badner 2012-02-22 00:59:49 -08:00
parent edf4b377ba
commit 3f62381d94
3 changed files with 111 additions and 5 deletions

View File

@ -1064,8 +1064,35 @@ private void bindCollectionKey(
bindCollectionKeyTargetingPropertyRef( attributeSource.getKeySource(), pluralAttributeBinding );
}
HibernateTypeDescriptor targetTypeDescriptor = pluralAttributeBinding.getHibernateTypeDescriptor();
final EntityBinding entityBinding = pluralAttributeBinding.getContainer().seekEntityBinding();
AttributeBinding referencedAttributeBinding =
attributeSource.getKeySource().getReferencedEntityAttributeName() == null ?
entityBinding.getHierarchyDetails().getEntityIdentifier().getValueBinding() :
entityBinding.locateAttributeBinding( attributeSource.getKeySource().getReferencedEntityAttributeName() );
if ( referencedAttributeBinding == null ) {
throw new MappingException(
String.format(
"Plural atttribute key references an attribute binding that does not exist: %s",
attributeSource.getKeySource().getReferencedEntityAttributeName()
),
currentBindingContext.getOrigin()
);
}
if ( ! referencedAttributeBinding.getAttribute().isSingular() ) {
throw new MappingException(
String.format(
"Plural attribute key references an attribute that is not singular: %s",
attributeSource.getKeySource().getReferencedEntityAttributeName()
),
currentBindingContext.getOrigin()
);
}
typeHelper.bindPluralAttributeKeyTypeInformation(
pluralAttributeBinding.getPluralAttributeKeyBinding(),
( SingularAttributeBinding ) referencedAttributeBinding
);
}
private void bindCollectionKeyTargetingPrimaryKey(

View File

@ -26,6 +26,7 @@
import java.beans.BeanInfo;
import java.beans.PropertyDescriptor;
import java.lang.reflect.ParameterizedType;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
@ -46,17 +47,20 @@
import org.hibernate.metamodel.spi.binding.PluralAttributeElementBinding;
import org.hibernate.metamodel.spi.binding.PluralAttributeElementNature;
import org.hibernate.metamodel.spi.binding.PluralAttributeIndexBinding;
import org.hibernate.metamodel.spi.binding.PluralAttributeKeyBinding;
import org.hibernate.metamodel.spi.binding.RelationalValueBinding;
import org.hibernate.metamodel.spi.binding.SingularAttributeBinding;
import org.hibernate.metamodel.spi.binding.TypeDefinition;
import org.hibernate.metamodel.spi.domain.PluralAttribute;
import org.hibernate.metamodel.spi.domain.SingularAttribute;
import org.hibernate.metamodel.spi.relational.AbstractValue;
import org.hibernate.metamodel.spi.relational.Column;
import org.hibernate.metamodel.spi.relational.JdbcDataType;
import org.hibernate.metamodel.spi.relational.Value;
import org.hibernate.metamodel.spi.source.ExplicitHibernateTypeSource;
import org.hibernate.metamodel.spi.source.MetadataImplementor;
import org.hibernate.metamodel.spi.source.PluralAttributeSource;
import org.hibernate.type.ComponentType;
import org.hibernate.type.Type;
import org.hibernate.type.TypeFactory;
@ -160,6 +164,50 @@ public void bindPluralAttributeTypeInformation(
processPluralAttributeTypeInformation( attributeBinding );
}
public void bindPluralAttributeKeyTypeInformation(
PluralAttributeKeyBinding keyBinding,
SingularAttributeBinding referencedAttributeBinding) {
final HibernateTypeDescriptor pluralAttributeKeyTypeDescriptor = keyBinding.getHibernateTypeDescriptor();
final HibernateTypeDescriptor referencedTypeDescriptor = referencedAttributeBinding.getHibernateTypeDescriptor();
pluralAttributeKeyTypeDescriptor.setExplicitTypeName( referencedTypeDescriptor.getExplicitTypeName() );
pluralAttributeKeyTypeDescriptor.setJavaTypeName( referencedTypeDescriptor.getJavaTypeName() );
// TODO: not sure about the following...
pluralAttributeKeyTypeDescriptor.setToOne( referencedTypeDescriptor.isToOne() );
pluralAttributeKeyTypeDescriptor.getTypeParameters().putAll( referencedTypeDescriptor.getTypeParameters() );
processPluralAttributeKeyInformation( keyBinding, referencedAttributeBinding );
}
private void processPluralAttributeKeyInformation(
PluralAttributeKeyBinding keyBinding,
SingularAttributeBinding referencedAttributeBinding) {
if ( keyBinding.getHibernateTypeDescriptor().getResolvedTypeMapping() != null ) {
return;
}
// we can determine the Hibernate Type if either:
// 1) the user explicitly named a Type in a HibernateTypeDescriptor
// 2) we know the java type of the attribute
Type resolvedType = determineHibernateTypeFromDescriptor( keyBinding.getHibernateTypeDescriptor() );
if ( resolvedType == null ) {
resolvedType = determineHibernateTypeFromAttributeJavaType( referencedAttributeBinding.getAttribute() );
}
if ( resolvedType != null ) {
Iterator<Column> fkColumnIterator = keyBinding.getForeignKey().getSourceColumns().iterator();
if ( resolvedType.isComponentType() ) {
ComponentType componentType = ( ComponentType ) resolvedType;
for ( Type subType : componentType.getSubtypes() ) {
pushHibernateTypeInformationDown( subType, fkColumnIterator.next() );
}
}
else {
pushHibernateTypeInformationDown( resolvedType, fkColumnIterator.next() );
}
}
}
private Class<?> determineJavaType(final SingularAttribute attribute) {
try {
final Class<?> ownerClass = attribute.getAttributeContainer().getClassReference();
@ -569,4 +617,4 @@ else if ( types.length == 2 ) {
}
}
}

View File

@ -79,6 +79,7 @@ private void doTest(MetadataSourceProcessingOrder processingOrder) {
MetadataImpl metadata = (MetadataImpl) sources.getMetadataBuilder().with( processingOrder ).buildMetadata();
final EntityBinding entityBinding = metadata.getEntityBinding( EntityWithBasicCollections.class.getName() );
final EntityIdentifier entityIdentifier = entityBinding.getHierarchyDetails().getEntityIdentifier();
assertNotNull( entityBinding );
PluralAttributeBinding bagBinding = metadata.getCollection( EntityWithBasicCollections.class.getName() + ".theBag" );
@ -104,11 +105,20 @@ private void doTest(MetadataSourceProcessingOrder processingOrder) {
assertFalse( fkBagColumnIterator.hasNext() );
assertFalse( fkBagSourceColumnIterator.hasNext() );
assertSame( entityBinding.getPrimaryTable(), fkBag.getTargetTable() );
assertEquals( entityBinding.getPrimaryTable().getPrimaryKey().getColumns(), fkBag.getTargetColumns() );
assertSame( entityBinding.getPrimaryTable().getPrimaryKey().getColumns(), fkBag.getTargetColumns() );
assertSame( ForeignKey.ReferentialAction.NO_ACTION, fkBag.getDeleteRule() );
assertSame( ForeignKey.ReferentialAction.NO_ACTION, fkBag.getUpdateRule() );
// FK is null because no default FK name is generated until HHH-7092 is fixed
// FK name is null because no default FK name is generated until HHH-7092 is fixed
assertNull( fkBag.getName() );
checkEquals(
entityIdentifier.getValueBinding().getHibernateTypeDescriptor(),
bagKeyBinding.getHibernateTypeDescriptor()
);
assertEquals( 0, bagBinding.getCollectionTable().getPrimaryKey().getColumnSpan() );
assertEquals(
entityBinding.getPrimaryTable().getPrimaryKey().getColumns().iterator().next().getJdbcDataType(),
bagKeyBinding.getForeignKey().getColumns().iterator().next().getJdbcDataType()
);
assertFalse( bagKeyBinding.isInverse() );
assertEquals( PluralAttributeElementNature.BASIC, bagBinding.getPluralAttributeElementBinding().getPluralAttributeElementNature() );
assertEquals( String.class.getName(), bagBinding.getPluralAttributeElementBinding().getHibernateTypeDescriptor().getJavaTypeName() );
@ -136,13 +146,34 @@ private void doTest(MetadataSourceProcessingOrder processingOrder) {
assertFalse( fkSetColumnIterator.hasNext() );
assertFalse( fkSetSourceColumnIterator.hasNext() );
assertSame( entityBinding.getPrimaryTable(), fkSet.getTargetTable() );
assertEquals( entityBinding.getPrimaryTable().getPrimaryKey().getColumns(), fkSet.getTargetColumns() );
assertSame( entityBinding.getPrimaryTable().getPrimaryKey().getColumns(), fkSet.getTargetColumns() );
assertSame( ForeignKey.ReferentialAction.NO_ACTION, fkSet.getDeleteRule() );
assertSame( ForeignKey.ReferentialAction.NO_ACTION, fkSet.getUpdateRule() );
// FK is null because no default FK name is generated until HHH-7092 is fixed
assertNull( fkSet.getName() );
checkEquals(
entityBinding.getHierarchyDetails().getEntityIdentifier().getValueBinding().getHibernateTypeDescriptor(),
setKeyBinding.getHibernateTypeDescriptor()
);
assertFalse( setKeyBinding.isInverse() );
assertEquals( 1, setBinding.getCollectionTable().getPrimaryKey().getColumnSpan() );
assertEquals(
entityBinding.getPrimaryTable().getPrimaryKey().getColumns().iterator().next().getJdbcDataType(),
setBinding.getCollectionTable().getPrimaryKey().getColumns().iterator().next().getJdbcDataType()
);
assertSame(
setBinding.getCollectionTable().getPrimaryKey().getColumns().iterator().next(),
setKeyBinding.getForeignKey().getColumns().iterator().next()
);
assertEquals( PluralAttributeElementNature.BASIC, setBinding.getPluralAttributeElementBinding().getPluralAttributeElementNature() );
assertEquals( String.class.getName(), setBinding.getPluralAttributeElementBinding().getHibernateTypeDescriptor().getJavaTypeName() );
}
private void checkEquals(HibernateTypeDescriptor expected, HibernateTypeDescriptor actual) {
assertEquals( expected.getExplicitTypeName(), actual.getExplicitTypeName() );
assertEquals( expected.getJavaTypeName(), actual.getJavaTypeName() );
assertEquals( expected.getTypeParameters(), actual.getTypeParameters() );
assertEquals( expected.getResolvedTypeMapping(), actual.getResolvedTypeMapping() );
assertEquals( expected.isToOne(), actual.isToOne() );
}
}