/* * Hibernate, Relational Persistence for Idiomatic Java * * Copyright (c) 2010, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.hibernate.mapping; import java.util.ArrayList; import java.util.Iterator; import java.util.Map; import org.hibernate.MappingException; import org.hibernate.cfg.Mappings; import org.hibernate.type.EntityType; import org.hibernate.type.Type; /** * A many-to-one association mapping * @author Gavin King */ public class ManyToOne extends ToOne { private boolean ignoreNotFound; private boolean isLogicalOneToOne; public ManyToOne(Mappings mappings, Table table) { super( mappings, table ); } public Type getType() throws MappingException { return getMappings().getTypeResolver().getTypeFactory().manyToOne( getReferencedEntityName(), getReferencedPropertyName(), isLazy(), isUnwrapProxy(), isEmbedded(), isIgnoreNotFound(), isLogicalOneToOne ); } public void createForeignKey() throws MappingException { // the case of a foreign key to something other than the pk is handled in createPropertyRefConstraints if (referencedPropertyName==null && !hasFormula() ) { createForeignKeyOfEntity( ( (EntityType) getType() ).getAssociatedEntityName() ); } } public void createPropertyRefConstraints(Map persistentClasses) { if (referencedPropertyName!=null) { PersistentClass pc = (PersistentClass) persistentClasses.get(getReferencedEntityName() ); Property property = pc.getReferencedProperty( getReferencedPropertyName() ); if (property==null) { throw new MappingException( "Could not find property " + getReferencedPropertyName() + " on " + getReferencedEntityName() ); } else { if ( !hasFormula() && !"none".equals( getForeignKeyName() ) ) { java.util.List refColumns = new ArrayList(); Iterator iter = property.getColumnIterator(); while ( iter.hasNext() ) { Column col = (Column) iter.next(); refColumns.add( col ); } ForeignKey fk = getTable().createForeignKey( getForeignKeyName(), getConstraintColumns(), ( (EntityType) getType() ).getAssociatedEntityName(), refColumns ); fk.setCascadeDeleteEnabled(isCascadeDeleteEnabled() ); } } } } public Object accept(ValueVisitor visitor) { return visitor.accept(this); } public boolean isIgnoreNotFound() { return ignoreNotFound; } public void setIgnoreNotFound(boolean ignoreNotFound) { this.ignoreNotFound = ignoreNotFound; } public void markAsLogicalOneToOne() { this.isLogicalOneToOne = true; } public boolean isLogicalOneToOne() { return isLogicalOneToOne; } }