/*
 * 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.cfg.annotations;
import java.util.Collections;
import java.util.Map;

import org.hibernate.AnnotationException;
import org.hibernate.annotations.CollectionId;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.common.reflection.XClass;
import org.hibernate.annotations.common.reflection.XProperty;
import org.hibernate.cfg.BinderHelper;
import org.hibernate.cfg.Ejb3Column;
import org.hibernate.cfg.Ejb3JoinColumn;
import org.hibernate.cfg.Mappings;
import org.hibernate.cfg.PropertyData;
import org.hibernate.cfg.PropertyInferredData;
import org.hibernate.cfg.WrappedInferredData;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.mapping.Collection;
import org.hibernate.mapping.IdentifierCollection;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.Table;

Author:Emmanuel Bernard
/** * @author Emmanuel Bernard */
public class IdBagBinder extends BagBinder { protected Collection createCollection(PersistentClass persistentClass) { return new org.hibernate.mapping.IdentifierBag( getMappings(), persistentClass ); } @Override protected boolean bindStarToManySecondPass( Map persistentClasses, XClass collType, Ejb3JoinColumn[] fkJoinColumns, Ejb3JoinColumn[] keyColumns, Ejb3JoinColumn[] inverseColumns, Ejb3Column[] elementColumns, boolean isEmbedded, XProperty property, boolean unique, TableBinder associationTableBinder, boolean ignoreNotFound, Mappings mappings) { boolean result = super.bindStarToManySecondPass( persistentClasses, collType, fkJoinColumns, keyColumns, inverseColumns, elementColumns, isEmbedded, property, unique, associationTableBinder, ignoreNotFound, mappings ); CollectionId collectionIdAnn = property.getAnnotation( CollectionId.class ); if ( collectionIdAnn != null ) { SimpleValueBinder simpleValue = new SimpleValueBinder(); PropertyData propertyData = new WrappedInferredData( new PropertyInferredData( null, property, null, //default access should not be useful mappings.getReflectionManager() ), "id" ); Ejb3Column[] idColumns = Ejb3Column.buildColumnFromAnnotation( collectionIdAnn.columns(), null, Nullability.FORCED_NOT_NULL, propertyHolder, propertyData, Collections.EMPTY_MAP, mappings ); //we need to make sure all id columns must be not-null. for(Ejb3Column idColumn:idColumns){ idColumn.setNullable(false); } Table table = collection.getCollectionTable(); simpleValue.setTable( table ); simpleValue.setColumns( idColumns ); Type typeAnn = collectionIdAnn.type(); if ( typeAnn != null && !BinderHelper.isEmptyAnnotationValue( typeAnn.type() ) ) { simpleValue.setExplicitType( typeAnn ); } else { throw new AnnotationException( "@CollectionId is missing type: " + StringHelper.qualify( propertyHolder.getPath(), propertyName ) ); } simpleValue.setMappings( mappings ); SimpleValue id = simpleValue.make(); ( (IdentifierCollection) collection ).setIdentifier( id ); String generator = collectionIdAnn.generator(); String generatorType; if ( "identity".equals( generator ) || "assigned".equals( generator ) || "sequence".equals( generator ) || "native".equals( generator ) ) { generatorType = generator; generator = ""; } else { generatorType = null; } BinderHelper.makeIdGenerator( id, generatorType, generator, mappings, localGenerators ); } return result; } }