mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-03-01 15:29:11 +00:00
HHH-7052 : Bind PluralAttributeKeyBinding
This commit is contained in:
parent
edf4b377ba
commit
3f62381d94
@ -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(
|
||||
|
@ -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 ) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -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() );
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user