/* * 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.orm.persister.embeddable.internal; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import org.hibernate.mapping.Component; import org.hibernate.mapping.Property; import org.hibernate.orm.persister.OrmTypeHelper; import org.hibernate.orm.persister.common.spi.AbstractManagedType; import org.hibernate.orm.persister.common.internal.PersisterHelper; import org.hibernate.orm.persister.common.spi.Column; import org.hibernate.orm.persister.embeddable.spi.EmbeddableContainer; import org.hibernate.orm.persister.common.spi.JoinColumnMapping; import org.hibernate.orm.persister.common.spi.ManagedTypeImplementor; import org.hibernate.orm.persister.common.spi.OrmAttribute; import org.hibernate.orm.persister.embeddable.spi.EmbeddableMapper; import org.hibernate.orm.persister.spi.PersisterCreationContext; import org.hibernate.orm.sql.convert.spi.TableGroupProducer; import org.hibernate.orm.type.descriptor.java.internal.EmbeddableJavaTypeDescriptorImpl; import org.hibernate.orm.type.descriptor.java.spi.EmbeddableJavaTypeDescriptor; import org.hibernate.orm.type.descriptor.java.spi.JavaTypeDescriptorRegistry; import org.hibernate.orm.type.descriptor.java.spi.MutabilityPlan; import org.hibernate.orm.type.internal.EmbeddedTypeImpl; import org.hibernate.orm.type.spi.EmbeddedType; /** * @author Steve Ebersole */ public class EmbeddableMapperImpl<T> extends AbstractManagedType<T> implements EmbeddableMapper<T> { private final EmbeddableContainer compositeContainer; private final String locaName; private final String roleName; private final EmbeddedType ormType; private final List<Column> allColumns; @SuppressWarnings("unchecked") public EmbeddableMapperImpl( PersisterCreationContext creationContext, ManagedTypeImplementor superTypeDescriptor, EmbeddableContainer compositeContainer, String locaName, Component embeddedMapping, MutabilityPlan mutabilityPlan, Comparator comparator, List<Column> allColumns) { super( resolveJtd( creationContext, embeddedMapping, mutabilityPlan, comparator ) ); this.compositeContainer = compositeContainer; this.locaName = locaName; this.roleName = compositeContainer.getRolePrefix() + '.' + locaName; this.allColumns = allColumns; this.ormType = new EmbeddedTypeImpl( null, roleName, getJavaTypeDescriptor() ); setTypeConfiguration( creationContext.getTypeConfiguration() ); ormType.setTypeConfiguration( creationContext.getTypeConfiguration() ); } private static EmbeddableJavaTypeDescriptor resolveJtd( PersisterCreationContext creationContext, Component embeddedMapping, MutabilityPlan mutabilityPlan, Comparator comparator) { JavaTypeDescriptorRegistry jtdr = creationContext.getTypeConfiguration().getJavaTypeDescriptorRegistry(); EmbeddableJavaTypeDescriptor jtd = (EmbeddableJavaTypeDescriptor) jtdr.getDescriptor( embeddedMapping.getType().getName() ); if ( jtd == null ) { jtd = new EmbeddableJavaTypeDescriptorImpl( embeddedMapping.getType().getName(), embeddedMapping.getType().getReturnedClass(), null, mutabilityPlan, comparator ); jtdr.addDescriptor( jtd ); } return jtd; } @Override @SuppressWarnings("unchecked") public EmbeddableJavaTypeDescriptor<T> getJavaTypeDescriptor() { return (EmbeddableJavaTypeDescriptor<T>) super.getJavaTypeDescriptor(); } @Override public void afterInitialization( Component embeddableBinding, PersisterCreationContext creationContext) { final Iterator<Property> mappingPropertyItr = embeddableBinding.getPropertyIterator(); while ( mappingPropertyItr.hasNext() ) { final Property mappingProperty = mappingPropertyItr.next(); // todo : Columns final List<Column> columns = Collections.emptyList(); final OrmAttribute attribute = PersisterHelper.INSTANCE.buildAttribute( creationContext, this, embeddableBinding, mappingProperty.getName(), OrmTypeHelper.convert( creationContext, this, locaName, mappingProperty.getValue(), creationContext.getTypeConfiguration() ), columns ); addAttribute( attribute ); } } @Override public String getRoleName() { return roleName; } @Override public EmbeddedType getOrmType() { return ormType; } @Override public TableGroupProducer resolveTableGroupProducer() { return compositeContainer.resolveTableGroupProducer(); } @Override public boolean canCompositeContainCollections() { return compositeContainer.canCompositeContainCollections(); } @Override public String getRolePrefix() { return getRoleName(); } public List<Column> collectColumns() { return allColumns; } @Override public EmbeddableContainer getSource() { return compositeContainer; } @Override public String getNavigableName() { return locaName; } @Override public String getTypeName() { return ormType.getJavaTypeDescriptor().getTypeName(); } @Override public PersistenceType getPersistenceType() { return PersistenceType.EMBEDDABLE; } @Override public EmbeddedType getExportedDomainType() { return ormType; } @Override public String asLoggableText() { return "EmdeddablePersister(" + roleName + " [" + getTypeName() + "])"; } @Override public List<JoinColumnMapping> resolveJoinColumnMappings(OrmAttribute attribute) { return Collections.emptyList(); } @Override public Class<T> getJavaType() { return getJavaTypeDescriptor().getJavaType(); } }