Hibernate não está fazendo o INNER JOIN automaticamente

Tenho as seguintes classes
[list]classe Acao, representa a ação que o usuário vai realizar no sistema(Salvar, cadastrar, deletar).[/list]
[list]classe Perfil, representa o perfil do Usuario.[/list]
[list]classe PermissaoPerfilAcao, que representa a permissao que o perfil tem para realizar determinado ação.[/list]
classe PermissaoPerfilAcao tem uma Chave composta formada pelas Classes Acao e Perfil. Utilizo Hibernate 3.

Código e mapeamento classe Acao

@Entity
@Table(name="acao")
public class Acao implements Serializable{
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column(name = "acao_id")
    private Integer id;
           
    @Column(name = "acao_nome", nullable=false, length=60)
    private String nome;    
       
    @ManyToOne( fetch = FetchType.EAGER)
    @JoinColumn( name="pgweb_id",insertable=true,updatable=true)
    @Fetch(FetchMode.JOIN)
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE    
    private Pgweb pagina;
    ...

Código e mapeamento classe Perfil

@Entity
@Table(name="perfil")
public class Perfil implements Serializable{
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column(name = "perfil_id")
    private Integer id;
    
    @Column(name = "perfil_nome",unique=true, nullable=false, length=40)
    private String nome;

Código e mapeamento classe PermissaoPerfilAcao

@Entity
@Table(name="permissao_perfil_acao")
public class PermissaoPerfilAcao implements Serializable{
    @EmbeddedId
    private PerfilAcaoPK chaveComposta;

    @Column(name="nivel_permissao", nullable=false)
    private int nivel;
    ...

Código e mapeamento chave composta PerfilAcaoPk

@Embeddable
public class PerfilAcaoPK implements Serializable{
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="perfil_id")
    @Fetch(FetchMode.JOIN)/
    @Cascade(org.hibernate.annotations.CascadeType.ALL    
    private Perfil perfil;
  
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="acao_id",insertable=true,updatable=true)
    @Fetch(FetchMode.JOIN)
    //@OrderBy("pagina, nome")
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    private Acao acao;
    ...

Quando tento pegar uma lista de permissões de um perfil(Olhar o metodo abaixo), sem ORDER BY, funciona perfeitamente, consigo pegar os dados do Objeto Acao(nome, pagina) e Perfil(nome) dentro do Objeto PermissaoPerfilAcao, e ele faz um único select(olhar abaixo QUERY sem ORDER BY). Mas quando tento fazer um ORDER BY Acao.nome , Acao.pagina, dá erro, por que no Query não tem um INNER JOIN para a tabela perfil e acão. Como faço para o Hibernate colocar o INNER JOIN no QUERY? ou se alguem tiver uma outra sugestão para mapear estes relacionamento.

QUERY sem ORDER BY (este funciona)
[color=red]Hibernate: select this_.acao_id as acao2_5_0_, this_.perfil_id as perfil3_5_0_, this_.nivel_permissao as nivel1_5_0_ from permissao_perfil_acao this_ where this_.perfil_id=? order by this_.acao_id asc, this_.perfil_id asc[/color]

QUERY com o ORDER BY só do nome(dá erro)
[color=red]Hibernate: select this_.acao_id as acao2_5_0_, this_.perfil_id as perfil3_5_0_, this_.nivel_permissao as nivel1_5_0_ from permissao_perfil_acao this_ where this_.perfil_id=? order by this_.acao_id asc, this_.perfil_id asc, a2_.acao_nome asc[/color]
Erro
[color=red]SEVERE: Unknown column ‘a2_.acao_nome’ in ‘order clause’[/color]

Metodo para pegar a lista de permissões de um perfil

public List<PermissaoPerfilAcao> getListPermissaoPerfil(Perfil p){
        try{
        Criteria c = session.createCriteria(PermissaoPerfilAcao.class);
        c.add(Expression.eq("chaveComposta.perfil",p));
        c.addOrder(Order.asc("chaveComposta"));
        //c.createAlias("chaveComposta", "ch").createAlias("ch.acao", "a").addOrder(Order.asc("a.nome"));        
        //c.addOrder(Order.asc("chaveComposta.acao.nome"));
        return c.list();
        }catch(Exception e){
            System.out.println(e);
            return null;
        }
    }

Nem um “comentáriozinho”.
Fazer o que…

Não teria uma propriedade em Criteria para novamente informar que você quer utilizar o fetch join ?
Ou então tente transformar o criteria em Query ; e adicione o fetch explicito.

1 pergunta…
Ao realizar o save no banco de um objeto (ex:Acao) que tenha outro aninhado (ex:Pgweb / FetchMode.JOIN) , voce tem o objeto aninhado somente com o ID setado ou o objeto buscado do banco ?