All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.boot.model.source.internal.hbm.SingularAttributeSourceOneToOneImpl Maven / Gradle / Ivy

There is a newer version: 7.0.0.Alpha1
Show newest version
/*
 * 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 .
 */
package org.hibernate.boot.model.source.internal.hbm;

import java.util.Collections;
import java.util.List;

import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmOnDeleteEnum;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmOneToOneType;
import org.hibernate.boot.model.JavaTypeDescriptor;
import org.hibernate.boot.model.source.spi.AttributePath;
import org.hibernate.boot.model.source.spi.AttributeRole;
import org.hibernate.boot.model.source.spi.AttributeSourceContainer;
import org.hibernate.boot.model.source.spi.DerivedValueSource;
import org.hibernate.boot.model.source.spi.NaturalIdMutability;
import org.hibernate.boot.model.source.spi.SingularAttributeNature;
import org.hibernate.boot.model.source.spi.SingularAttributeSourceOneToOne;
import org.hibernate.boot.model.source.spi.ToolingHintContext;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.type.ForeignKeyDirection;

/**
 * Implementation for {@code } mappings
 *
 * @author Gail Badner
 * @author Steve Ebersole
 */
class SingularAttributeSourceOneToOneImpl
		extends AbstractToOneAttributeSourceImpl
		implements SingularAttributeSourceOneToOne {

	private final JaxbHbmOneToOneType oneToOneElement;
	private final HibernateTypeSourceImpl typeSource;

	private final String referencedTypeName;

	private final List formulaSources;

	private final AttributeRole attributeRole;
	private final AttributePath attributePath;

	private final FetchCharacteristicsSingularAssociationImpl fetchCharacteristics;

	private ToolingHintContext toolingHintContext;

	SingularAttributeSourceOneToOneImpl(
			MappingDocument mappingDocument,
			AttributeSourceContainer container,
			final JaxbHbmOneToOneType oneToOneElement,
			final String logicalTableName,
			NaturalIdMutability naturalIdMutability) {
		super( mappingDocument, naturalIdMutability );
		this.oneToOneElement = oneToOneElement;

		this.referencedTypeName = oneToOneElement.getClazz() != null
				? metadataBuildingContext().qualifyClassName( oneToOneElement.getClazz() )
				: oneToOneElement.getEntityName();
		final JavaTypeDescriptor referencedTypeDescriptor = new JavaTypeDescriptor() {
			@Override
			public String getName() {
				return referencedTypeName;
			}
		};
		this.typeSource = new HibernateTypeSourceImpl( referencedTypeDescriptor );

		if ( StringHelper.isNotEmpty( oneToOneElement.getFormulaAttribute() ) ) {
			formulaSources = Collections.singletonList(
					(DerivedValueSource) new FormulaImpl( mappingDocument, logicalTableName, oneToOneElement.getFormulaAttribute() )
			);
		}
		else if ( !oneToOneElement.getFormula().isEmpty() ) {
			this.formulaSources = CollectionHelper.arrayList( oneToOneElement.getFormula().size() );
			for ( String expression : oneToOneElement.getFormula() ) {
				formulaSources.add(
						new FormulaImpl( mappingDocument, logicalTableName, expression )
				);
			}
		}
		else {
			this.formulaSources = Collections.emptyList();
		}

		this.attributeRole = container.getAttributeRoleBase().append( oneToOneElement.getName() );
		this.attributePath = container.getAttributePathBase().append( oneToOneElement.getName() );

		this.fetchCharacteristics = FetchCharacteristicsSingularAssociationImpl.interpretOneToOne(
				mappingDocument.getMappingDefaults(),
				oneToOneElement.getFetch(),
				oneToOneElement.getOuterJoin(),
				oneToOneElement.getLazy(),
				oneToOneElement.isConstrained()
		);

		this.toolingHintContext = Helper.collectToolingHints(
				container.getToolingHintContext(),
				oneToOneElement
		);
	}

	@Override
	public XmlElementMetadata getSourceType() {
		return XmlElementMetadata.ONE_TO_ONE;
	}

	@Override
	public String getName() {
		return oneToOneElement.getName();
	}

	@Override
	public String getXmlNodeName() {
		return oneToOneElement.getNode();
	}

	@Override
	public AttributePath getAttributePath() {
		return attributePath;
	}

	@Override
	public AttributeRole getAttributeRole() {
		return attributeRole;
	}

	@Override
	public HibernateTypeSourceImpl getTypeInformation() {
		return typeSource;
	}

	@Override
	public String getPropertyAccessorName() {
		return oneToOneElement.getAccess();
	}

	@Override
	public boolean isIncludedInOptimisticLocking() {
		return true;
	}

	@Override
	public String getCascadeStyleName() {
		return oneToOneElement.getCascade();
	}

	@Override
	public SingularAttributeNature getSingularAttributeNature() {
		return SingularAttributeNature.ONE_TO_ONE;
	}

	@Override
	public Boolean isInsertable() {
		return false;
	}

	@Override
	public Boolean isUpdatable() {
		return false;
	}

	@Override
	public boolean isBytecodeLazy() {
		return false;
	}

	@Override
	public FetchCharacteristicsSingularAssociationImpl getFetchCharacteristics() {
		return fetchCharacteristics;
	}

	@Override
	public boolean isVirtualAttribute() {
		return false;
	}

	@Override
	public String getReferencedEntityName() {
		return referencedTypeName;
	}

	@Override
	public boolean isUnique() {
		return true;
	}

	@Override
	public String getExplicitForeignKeyName() {
		return oneToOneElement.getForeignKey();
	}

	@Override
	public boolean isCascadeDeleteEnabled() {
		return JaxbHbmOnDeleteEnum.CASCADE.equals( oneToOneElement.getOnDelete() );
	}

	@Override
	public ForeignKeyDirection getForeignKeyDirection() {
		return oneToOneElement.isConstrained()  ? ForeignKeyDirection.FROM_PARENT : ForeignKeyDirection.TO_PARENT;
	}

	@Override
	public List getFormulaSources() {
		return formulaSources;
	}

	@Override
	public ToolingHintContext getToolingHintContext() {
		return toolingHintContext;
	}

	@Override
	public boolean isConstrained() {
		return oneToOneElement.isConstrained();
	}

	@Override
	public String getReferencedEntityAttributeName() {
		return oneToOneElement.getPropertyRef();
	}

	@Override
	public Boolean isEmbedXml() {
		return oneToOneElement.isEmbedXml();
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy