# AlreadyAssignedMarkerStep.java

    package org.codefilarete.stalactite.engine.configurer.builder;

    import org.codefilarete.stalactite.dsl.idpolicy.AlreadyAssignedIdentifierPolicy;
    import org.codefilarete.stalactite.engine.listener.SelectListener;
    import org.codefilarete.stalactite.engine.runtime.ConfiguredRelationalPersister;
    import org.codefilarete.stalactite.mapping.id.manager.AlreadyAssignedIdentifierManager;
    import org.codefilarete.stalactite.mapping.id.manager.IdentifierInsertionManager;

    /**
     * Attach {@link SelectListener} for {@link AlreadyAssignedIdentifierPolicy} when relevant.
     *
     * @param <C>
     * @param <I>
     * @author Guillaume Mary
     */
    public class AlreadyAssignedMarkerStep<C, I> {

    	void handleAlreadyAssignedMarker(ConfiguredRelationalPersister<C, I> persister) {
    		// when identifier policy is already-assigned one, we must ensure that entity is marked as persisted when it comes back from database
    		// because user may forget to / can't mark it as such
    		IdentifierInsertionManager<C, I> identifierInsertionManager = persister.getMapping().getIdMapping().getIdentifierInsertionManager();
    		if (identifierInsertionManager instanceof AlreadyAssignedIdentifierManager) {
    			// Transferring identifier manager InsertListener to here
    			persister.addInsertListener(((AlreadyAssignedIdentifierManager<C, I>) identifierInsertionManager).getInsertListener());
    			persister.addSelectListener(((AlreadyAssignedIdentifierManager<C, I>) identifierInsertionManager).getSelectListener());
    		}
    	}
    }