Mapeamento classe com chave composta por outra classe de chave composta [RESOLVIDO]

Bom dia galera, estou com o seguinte problema, tenho uma classe que é composta por um código e outra classe, que por sua vez também é de chave composta, um dos problemas é que os nomes dos campos são diferentes entre as classes, até consegui fazer a consulta no banco, mas não tenho acesso aos dados da segunda classe, segue abaixo como está no momento.

public class UnidadeGestoraId implements Serializable{
    
    private Integer anoBase;
    
    private Integer codigo;

    /* Getters and Setters */
    {...}
}
public class UnidadeGestora implements  Serializable{

    private UnidadeGestoraId id;
    
    private String nome;

    /* Getters and Setters */
    {...}
}
public class PlanoDespesaId implements Serializable{
    
    private UnidadeGestora unidadeGestora;
    
    private String codigo;

    /* Getters and Setters */
    {...}
}
public class PlanoDespesa implements Serializable{

    private PlanoDespesaId id;
    
    private String nome;

    /* Getters and Setters */
    {...}
}
<hibernate-mapping>
    <class name="UnidadeGestora" table="unidade_gestora">
        <composite-id name="id" class="UnidadeGestoraId">
            <key-property name="anoBase" column="ANO_BASE" type="integer"/>            
            <key-property name="codigo" column="CODIGO" type="integer"/>            
        </composite-id>
        <property name="nome" type="string">
            <column name="nome"/>
        </property>
    </class>
</hibernate-mapping>
<hibernate-mapping>
    <class name="PlanoDespesa" table="plano_despesa">
        <composite-id name="id" class="PlanoDespesaId">
            <key-many-to-one name="unidadeGestora" class="UnidadeGestora"
                foreign-key="fk_plano_despesa_un_gestora" >
                <column name="ANO_BASE"/>
                <column name="UNIDADE_GESTORA"/>
            </key-many-to-one>
            <key-property name="codigo" column="CODIGO" type="string"/>
        </composite-id>
        <property name="nome" type="string">
            <column name="NOME" length="50" not-null="true"/>
        </property>
    </class>
</hibernate-mapping>

Da forma que está agora, não consigo nem mesmo fazer filtros como o seguintefrom PlanoDespesa where id.unidadeGestora.anoBase = 2012

Só me responda uma coisa, com chave simples você não consegue fazer isso?

Eu simplesmente abomino a idéia de que algo não seja possível de se resolver com chave simples. Chaves compostas devem ser utilizadas quando todas as colunas no banco poderão ter valores duplicados, mas, duas ou mais colunas agrupadas nunca terão valores repetidos.

No pior caso, você incluiria uma coluna para controle da atomicidade dos valores, como um índice (id).

Enfim, pode ser que eu tenha uma visão limitada ou muito purista da coisa toda, mas que aparentemente tua especificação pode ser muito melhorada, pode.

Olá drsmachado, o problema é que o banco de dados foi feito para uso no delphi, e já está em uso a muito tempo, apenas estamos implementando algumas funcionalidades para a web, eu também não gosto nem um pouco de chaves compostas, mas não tenho como mudar a estrutura do banco de dados, iriamos ter que mudar muitos sistemas.

O problema é tentar adequar uma modelagem obsoleta, ruim e malfeita à uma tecnologia mais evoluída.
Sugiro fortemente deixar o hibernate e usar jdbc mesmo.
Vai dar mais trabalho nas queries, mas menos no mapeamento.

Como ainda não obtive uma solução definitiva, para não parar o projeto, e como não posso simplesmente mudar tudo o que já está feito, a solução foi redeclarar os atributos da classe UnidadeGestora que fazem parte da chave da PlanoDespesa, e setar as propriedades insert e update como false, como apresentado abaixo.
Dessa forma eu tenho acesso aos atributos e também aplicar filtros nos mesmos, claro que não é a solução definitiva. Continuarei pesquisando, e ficarei sempre de olho no tópico na esperança que alguém tenha uma resposta.

<hibernate-mapping>
    <class name="PlanoDespesa" table="plano_despesa">
         <composite-id name="id" class="PlanoDespesaId">
            <key-many-to-one name="unidadeGestora" class="UnidadeGestora" foreign-key="fk_plano_despesa_un_gestora" >
                <column name="ANO_BASE"/>
                <column name="UNIDADE_GESTORA"/>
            </key-many-to-one>
            <key-property name="codigo" column="CODIGO" type="string"/>
        </composite-id>
        <property name="anoBase" type="integer" insert="false" update="false">
            <column name="ANO_BASE" not-null="true"/>
        </property>
        <property name="unidadeGestora" type="integer" insert="false" update="false">
            <column name="UNIDADE_GESTORA" not-null="true"/>
        </property>
        <property name="nome" type="string">
            <column name="NOME" length="50" not-null="true"/>
        </property>
    </class>
</hibernate-mapping>

Amigo porque não usar anotação para mapiar as classes etc?

Bom galera, hoje voltei a pesquisar sobre o meu problema, e achei a solução, na verdade estava faltando colocar o parâmetro lazy="false" e tudo se resolveu, pois por default o hibernate não carrega estas informações, então ficou da seguinte forma

<hibernate-mapping>
    <class name="PlanoDespesa" table="plano_despesa">
        <composite-id name="id" class="PlanoDespesaId">
            <key-many-to-one name="unidadeGestora" class="UnidadeGestora" foreign-key="fk_plano_despesa_un_gestora" lazy="false">
                <column name="ANO_BASE"/>
                <column name="UNIDADE_GESTORA"/>
            </key-many-to-one>
            <key-property name="codigo" column="CODIGO" type="string"/>
        </composite-id>
        <property name="nome" type="string">
            <column name="NOME" length="50" not-null="true"/>
        </property>
    </class>
</hibernate-mapping>