# AbstractOneToOneEngine.java

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

    import java.util.Map;

    import org.codefilarete.reflection.Accessor;
    import org.codefilarete.stalactite.engine.configurer.onetoone.OrphanRemovalOnUpdate;
    import org.codefilarete.stalactite.engine.runtime.ConfiguredPersister;
    import org.codefilarete.stalactite.sql.ddl.structure.Column;
    import org.codefilarete.stalactite.sql.ddl.structure.Table;

    public class AbstractOneToOneEngine<SRC, TRGT, SRCID, TRGTID, LEFTTABLE extends Table<LEFTTABLE>, RIGHTTABLE extends Table<RIGHTTABLE>> {

    	protected final ConfiguredPersister<SRC, SRCID> sourcePersister;

    	protected final ConfiguredPersister<TRGT, TRGTID> targetPersister;

    	protected final Map<Column<LEFTTABLE, ?>, Column<RIGHTTABLE, ?>> keyColumnsMapping;

    	protected final Accessor<SRC, TRGT> targetAccessor;

    	public AbstractOneToOneEngine(ConfiguredPersister<SRC, SRCID> sourcePersister,
    								  ConfiguredPersister<TRGT, TRGTID> targetPersister,
    								  Accessor<SRC, TRGT> targetAccessor,
    								  Map<Column<LEFTTABLE, ?>, Column<RIGHTTABLE, ?>> keyColumnsMapping) {
    		this.sourcePersister = sourcePersister;
    		this.targetPersister = targetPersister;
    		this.keyColumnsMapping = keyColumnsMapping;
    		this.targetAccessor = targetAccessor;
    	}

    	public void addInsertCascade() {
    	}

    	public void addUpdateCascade(boolean orphanRemoval) {
    		if (orphanRemoval) {
    			sourcePersister.addUpdateListener(new OrphanRemovalOnUpdate<>(targetPersister, targetAccessor));
    		}
    	}

    	public void addDeleteCascade(boolean orphanRemoval) {
    	}
    }