[Hibernate] Chaves compostas causando problemas

E aí pessoal, seguinte, estou com um problema no hibernate que é o seguinte tenho uma estrutura bem complexa de pais e filhos e todos com chave composta. Os mapeamentos entre pais e filhos são todos bidirecionais. Aparentemente, quando pego a primeira coleção de filhos tudo corre bem, entretanto, quando busco a coleção de filhos que pertence a um dos filhos trazidos na primeira coleção o hibernate parece não carregar a coleção e causa um null pointer exception. (é importante frisar que existe a terceira coleção de filhos, se fizer um debug dentro do hibernate ele chega a buscar os filhos, mas parece não conseguir substituir o proxy).

Abaixo estou enviando os mapeamentos e as classes:

<hibernate-mapping>
    <class name="com.industrial.engenharia.fichatecnica.servidor.FichaTecnica" table="fichas_tecnicas">
        <id name="idFichaTecnica" type="java.lang.Integer" column="ID_FICHA_TECNICA">
           <generator class="increment"/>
        </id>
        <set name="ftFases" inverse="true" cascade="all-delete-orphan">
           <key column="ID_FICHA_TECNICA"/>
           <one-to-many class="com.industrial.engenharia.fichatecnica.servidor.FtFase"/>
        </set>
    </class>
</hibernate-mapping>
public class FichaTecnica implements Serializable {
	
    private Integer idFichaTecnica;
    private Set ftFases;
	
    public Integer getIdFichaTecnica() {
        return idFichaTecnica;
    }

    public void setIdFichaTecnica(Integer integer) {
        idFichaTecnica = integer;
    }

    public Set getFtFases() {
        return ftFases;
    }

    public void setFtFases(Set set) {
        ftFases = set;
    }
    
    public void addFtFase(FtFase ftFase) {
    	ftFase.setFichaTecnica(this);
    	if (getFtFases() == null) {
    		setFtFases(new HashSet());
    	}
    	getFtFases().add(ftFase);
    }
    
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!super.equals(o)) {
            return false;
        }
        if (o == null) {
            return false;
        }
        if (o.getClass() != getClass()) {
            return false;
        }
        FichaTecnica castedObj = (FichaTecnica) o;
        return (
            (this.idFichaTecnica == null ? castedObj.idFichaTecnica == null : this.idFichaTecnica.equals(castedObj.idFichaTecnica)));
    }

    public int hashCode() {
        int hashCode = super.hashCode();
        hashCode = 31 * hashCode + (idFichaTecnica == null ? 0 : idFichaTecnica.hashCode());
        return hashCode;
    }
}
<hibernate-mapping>
    <class name="com.industrial.engenharia.fichatecnica.servidor.FtFase" table="FT_FASES">
        <composite-id unsaved-value="any">
           <key-property name="idFtFase" column="ID_FT_FASE"/>
           <key-property name="idFichaTecnica" column="ID_FICHA_TECNICA"/>
        </composite-id>
        <set name="ftProcedencias" lazy="true" inverse="true" cascade="all-delete-orphan">
           <key>
              <column name="ID_FT_FASE"/>
              <column name="ID_FICHA_TECNICA"/>
           </key>
           <one-to-many class="com.industrial.engenharia.fichatecnica.servidor.FtProcedencia"/>
        </set>
        <many-to-one name="fichaTecnica" class="com.industrial.engenharia.fichatecnica.servidor.FichaTecnica" column="ID_FICHA_TECNICA" insert="false" update="false"/>
    </class>
</hibernate-mapping>
public class FtFase extends Persistent implements Serializable {
	private Integer idFichaTecnica;	
	private Integer idFtFase;
	private FichaTecnica fichaTecnica; 
	private Set ftProcedencias;

    public FichaTecnica getFichaTecnica() {
        return fichaTecnica;
    }

    public Set getFtProcedencias() {
        return ftProcedencias;
    }

    public Integer getIdFichaTecnica() {
        return idFichaTecnica;
    }

    public Integer getIdFtFase() {
        return idFtFase;
    }

    public void setFichaTecnica(FichaTecnica tecnica) {
        setIdFichaTecnica(tecnica.getIdFichaTecnica());
        fichaTecnica = tecnica;
    }

    public void setFtProcedencias(Set set) {
        ftProcedencias = set;
    }

    public void setIdFichaTecnica(Integer integer) {
        idFichaTecnica = integer;
    }

    public void setIdFtFase(Integer integer) {
        idFtFase = integer;
    }
    
    public void addFtProcedencia(FtProcedencia ftProcedencia) {
    	ftProcedencia.setFtFase(this);
    	if (getFtProcedencias() == null) {
    	     setFtProcedencias(new HashSet());
   	}
	getFtProcedencias().add(ftProcedencia);
    }

    public int hashCode() {
        int hashCode = super.hashCode();
        hashCode = 31 * hashCode + (idFichaTecnica == null ? 0 : idFichaTecnica.hashCode());
        hashCode = 31 * hashCode + (idFtFase == null ? 0 : idFtFase.hashCode());
        hashCode = 31 * hashCode + (fichaTecnica == null ? 0 : fichaTecnica.hashCode());
        return hashCode;
    }

    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!super.equals(o)) {
            return false;
        }
        if (o == null) {
            return false;
        }
        if (o.getClass() != getClass()) {
            return false;
        }
        FtFase castedObj = (FtFase) o;
        return (
            (this.idFichaTecnica == null ? castedObj.idFichaTecnica == null : this.idFichaTecnica.equals(castedObj.idFichaTecnica))
                && (this.idFtFase == null ? castedObj.idFtFase == null : this.idFtFase.equals(castedObj.idFtFase)));
    }
}
<hibernate-mapping>
    <class name="com.industrial.engenharia.fichatecnica.servidor.FtProcedencia" table="FT_PROCEDENCIAS">
        <composite-id unsaved-value="any">
           <key-property name="idFtProcedencia" column="ID_FT_PROCEDENCIA"/>
           <key-property name="idFtFase" column="ID_FT_FASE"/>
           <key-property name="idFichaTecnica" column="ID_FICHA_TECNICA"/>
        </composite-id>
        <many-to-one name="ftFase" class="com.industrial.engenharia.fichatecnica.servidor.FtFase" update="false" insert="false" >
           <column name="ID_FT_FASE"/>
           <column name="ID_FICHA_TECNICA"/>
        </many-to-one>
    </class>
</hibernate-mapping>
public class FtProcedencia extends Persistent implements Serializable {
	private Integer idFichaTecnica;	
	private Integer idFtFase;
	private Integer idFtProcedencia;
	private FtFase ftFase;

    public FtFase getFtFase() {
        return ftFase;
    }

    public Integer getIdFichaTecnica() {
        return idFichaTecnica;
    }

    public Integer getIdFtFase() {
        return idFtFase;
    }

    public Integer getIdFtProcedencia() {
        return idFtProcedencia;
    }

    public void setFtFase(FtFase fase) {
        setIdFichaTecnica(fase.getIdFichaTecnica());
        setIdFtFase(fase.getIdFtFase());
        ftFase = fase;
    }

    public void setIdFichaTecnica(Integer integer) {
        idFichaTecnica = integer;
    }

    public void setIdFtFase(Integer integer) {
        idFtFase = integer;
    }

    public void setIdFtProcedencia(Integer integer) {
        idFtProcedencia = integer;
    }

    public void addFtTonalidade(FtTonalidade ftTonalidade) {
        ftTonalidade.setFtProcedencia(this);
        if (getFtTonalidades() == null) {
            setFtTonalidades(new HashSet());
        }
        getFtTonalidades().add(ftTonalidade);
     }

    public int hashCode() {
        int hashCode = super.hashCode();
        hashCode = 31 * hashCode + (idFichaTecnica == null ? 0 : idFichaTecnica.hashCode());
        hashCode = 31 * hashCode + (idFtFase == null ? 0 : idFtFase.hashCode());
        hashCode = 31 * hashCode + (idFtProcedencia == null ? 0 : idFtProcedencia.hashCode());
        return hashCode;
    }

    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!super.equals(o)) {
            return false;
        }
        if (o == null) {
            return false;
        }
        if (o.getClass() != getClass()) {
            return false;
        }
        FtProcedencia castedObj = (FtProcedencia) o;
        return (
            (this.idFichaTecnica == null ? castedObj.idFichaTecnica == null : this.idFichaTecnica.equals(castedObj.idFichaTecnica))
                && (this.idFtFase == null ? castedObj.idFtFase == null : this.idFtFase.equals(castedObj.idFtFase))
                && (this.idFtProcedencia == null ? castedObj.idFtProcedencia == null : this.idFtProcedencia.equals(castedObj.idFtProcedencia)));
    }
}

Desculpe a quantidade de código, mas como pode ser um problema nas próprias classes tive que postá-las de uma maneira que fosse inteligível. Retirei vários campos dos mapeamentos e das classes e deixei apenas onde aparentemente podia se encontrar o problema. Também retirei o resto da estrutura, pois apartir dai todas as ftProcedencias possuem uma coleção de tonalidades e por ai vai.
Outra coisa, se eu tirar o lazy=“true” dos sets parece-me que o hibernate entrra em loop e fica buscando em ft_fases e ft_procedencias em sequência e preciso matar o processo.
Hmmm, as chaves não mapeiam o objeto pelo fato da estrutura ser muito grande e isso acabaria fazendo com q para fazer load de um objeto na estrutra eu teria que criar muitas keys.

Vallew