/*
 * 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.mapping;

import java.util.Iterator;
import java.util.Objects;

import org.hibernate.FetchMode;
import org.hibernate.MappingException;
import org.hibernate.boot.spi.MetadataBuildingContext;
import org.hibernate.boot.spi.MetadataImplementor;
import org.hibernate.engine.spi.Mapping;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.type.EntityType;
import org.hibernate.type.Type;

A mapping for a one-to-many association
Author:Gavin King
/** * A mapping for a one-to-many association * * @author Gavin King */
public class OneToMany implements Value { private final MetadataImplementor metadata; private final Table referencingTable; private String referencedEntityName; private PersistentClass associatedClass; private boolean ignoreNotFound;
Deprecated:Use OneToMany(MetadataBuildingContext, PersistentClass) instead.
/** * @deprecated Use {@link OneToMany#OneToMany(MetadataBuildingContext, PersistentClass)} instead. */
@Deprecated public OneToMany(MetadataImplementor metadata, PersistentClass owner) throws MappingException { this.metadata = metadata; this.referencingTable = ( owner == null ) ? null : owner.getTable(); } public OneToMany(MetadataBuildingContext buildingContext, PersistentClass owner) throws MappingException { this.metadata = buildingContext.getMetadataCollector(); this.referencingTable = ( owner == null ) ? null : owner.getTable(); } @Override public ServiceRegistry getServiceRegistry() { return metadata.getMetadataBuildingOptions().getServiceRegistry(); } private EntityType getEntityType() { return metadata.getTypeResolver().getTypeFactory().manyToOne( getReferencedEntityName(), true, null, false, false, isIgnoreNotFound(), false ); } public PersistentClass getAssociatedClass() { return associatedClass; }
Associated entity on the many side
/** * Associated entity on the many side */
public void setAssociatedClass(PersistentClass associatedClass) { this.associatedClass = associatedClass; } public void createForeignKey() { // no foreign key element of for a one-to-many } public Iterator<Selectable> getColumnIterator() { return associatedClass.getKey().getColumnIterator(); } public int getColumnSpan() { return associatedClass.getKey().getColumnSpan(); } public FetchMode getFetchMode() { return FetchMode.JOIN; }
Table of the owner entity (the "one" side)
/** * Table of the owner entity (the "one" side) */
public Table getTable() { return referencingTable; } public Type getType() { return getEntityType(); } public boolean isNullable() { return false; } public boolean isSimpleValue() { return false; } public boolean isAlternateUniqueKey() { return false; } public boolean hasFormula() { return false; } public boolean isValid(Mapping mapping) throws MappingException { if ( referencedEntityName == null ) { throw new MappingException( "one to many association must specify the referenced entity" ); } return true; } public String getReferencedEntityName() { return referencedEntityName; }
Associated entity on the "many" side
/** * Associated entity on the "many" side */
public void setReferencedEntityName(String referencedEntityName) { this.referencedEntityName = referencedEntityName == null ? null : referencedEntityName.intern(); } public void setTypeUsingReflection(String className, String propertyName) { } public Object accept(ValueVisitor visitor) { return visitor.accept( this ); } @Override public boolean isSame(Value other) { return this == other || other instanceof OneToMany && isSame( (OneToMany) other ); } public boolean isSame(OneToMany other) { return Objects.equals( referencingTable, other.referencingTable ) && Objects.equals( referencedEntityName, other.referencedEntityName ) && Objects.equals( associatedClass, other.associatedClass ); } public boolean[] getColumnInsertability() { //TODO: we could just return all false... throw new UnsupportedOperationException(); } public boolean[] getColumnUpdateability() { //TODO: we could just return all false... throw new UnsupportedOperationException(); } public boolean isIgnoreNotFound() { return ignoreNotFound; } public void setIgnoreNotFound(boolean ignoreNotFound) { this.ignoreNotFound = ignoreNotFound; } }