# OneToManyWithAssociationTableEngine.java

    package org.codefilarete.stalactite.engine.runtime.onetomany;

    import java.util.Collection;
    import java.util.function.Function;

    import org.codefilarete.stalactite.engine.runtime.AssociationRecord;
    import org.codefilarete.stalactite.engine.runtime.AssociationRecordInsertionCascader;
    import org.codefilarete.stalactite.engine.runtime.AssociationRecordPersister;
    import org.codefilarete.stalactite.engine.runtime.AssociationTable;
    import org.codefilarete.stalactite.engine.runtime.ConfiguredRelationalPersister;
    import org.codefilarete.stalactite.mapping.EntityMapping;
    import org.codefilarete.stalactite.sql.statement.WriteOperationFactory;

    /**
     * @author Guillaume Mary
     */
    public class OneToManyWithAssociationTableEngine<SRC, TRGT, SRCID, TRGTID, C extends Collection<TRGT>, T extends AssociationTable<T, ?, ?, SRCID, TRGTID>>
    		extends AbstractOneToManyWithAssociationTableEngine<SRC, TRGT, SRCID, TRGTID, C, AssociationRecord, T> {

    	public OneToManyWithAssociationTableEngine(ConfiguredRelationalPersister<SRC, SRCID> sourcePersister,
    											   ConfiguredRelationalPersister<TRGT, TRGTID> targetPersister,
    											   ManyRelationDescriptor<SRC, TRGT, C> manyRelationDescriptor,
    											   AssociationRecordPersister<AssociationRecord, T> associationPersister,
    											   WriteOperationFactory writeOperationFactory) {
    		super(sourcePersister, targetPersister, manyRelationDescriptor, associationPersister, writeOperationFactory);
    	}

    	@Override
    	protected AssociationRecordInsertionCascader<SRC, TRGT, SRCID, TRGTID, C> newRecordInsertionCascader(
    			Function<SRC, C> collectionGetter,
    			AssociationRecordPersister<AssociationRecord, T> associationPersister,
    			EntityMapping<SRC, SRCID, ?> mappingStrategy,
    			EntityMapping<TRGT, TRGTID, ?> targetStrategy) {
    		return new AssociationRecordInsertionCascader<>(associationPersister, collectionGetter, mappingStrategy, targetStrategy);
    	}

    	@Override
    	protected AssociationRecord newRecord(SRC e, TRGT target, int index) {
    		return new AssociationRecord(sourcePersister.getMapping().getId(e), targetPersister.getMapping().getId(target));
    	}
    }