Duvida de mapeamento n-n com em classe associativa com HIBERNATE

fala galera bom dessa vez eu venho com uma duvida um pouco + avançada q o de costume(ou pelo menos, menos ridicula)

estou tentando fazer um exercício que vi na internet + não estou conseguindo fazer o mapeamento(somente este os outros consegui numa boa)

no hospital o paciente pode ter mais de um d 1 plano de saúde por razões q ainda desconheço(e não concordo) o paciente nunca pode ter o msm plano 2 vezes ou seja chave composta (idPaciente, idPlano), o exercico especifica q deve ser usado chave composta, e tb deve ser classe composta pois tem atributos q pertence somente a ela como inicio, ativo, e outras coisas o exercício lista

pois bem, procurei no google e achei vários tutoriais e achei 3 formas de se fazer, em todas elas o inicio era basicamente o mesmo criar uma classe com os objetos(um deles como os atributos q formam a chave) e fiz todas elas porem basicamente deu o msm erro

FORMA 1 (com objeto):

public class PlanoPacientePK implements Serializable{
    @ManyToOne
    @JoinColumn(name="plano_id")
    private Plano plano;

    @ManyToOne
    @JoinColumn(name="paciente_id")
    private Paciente paciente;

    //construtores + gets + sets + hashCode + equals

}

@Entity
@Table
public class PlanoPaciente implements Serializable{
    @EmbeddedId
    private PlanoPacientePK id;

    //construtores + gets + sets + hashCode + equals

   public Paciente getPaciente() {
        return this.id.getPaciente();
    }

    public void setPaciente(Paciente p) {
        this.id.setPaciente(p);
    }

    public Plano getPlano() {
        return id.getPlano();
    }

    public void setPlano(Plano p) {
        this.id.setPlano(p);
    }

}[/code]

FORMA 2 (com objeto):

[code]public class PlanoPacientePK implements Serializable{
    @ManyToOne
    private Plano plano;

    @ManyToOne
    private Paciente paciente;

    //construtores + gets + sets + hashCode + equals

}

@Entity
@Table
@AssociationOverrides({
    @AssociationOverride(name = "id.plano" , joinColumns = @JoinColumn(name = "plano_id")),
    @AssociationOverride(name = "id.paciente", joinColumns = @JoinColumn(name = "paciente_id"))
        })
public class PlanoPaciente implements Serializable{
    @EmbeddedId
    private PlanoPacientePK id;

    //construtores + gets + sets + hashCode + equals

   public Paciente getPaciente() {
        return this.id.getPaciente();
    }

    public void setPaciente(Paciente p) {
        this.id.setPaciente(p);
    }

    public Plano getPlano() {
        return id.getPlano();
    }

    public void setPlano(Plano p) {
        this.id.setPlano(p);
    }
}

FORMA 3 (com atributo *_id):

public class PlanoPacientePK implements Serializable{

    private Integer idPlano;

    private Integer idPaciente;

    //construtores + gets + sets + hashCode + equals
}

@Entity
@Table
public class PlanoPaciente implements Serializable{
    @EmbeddedId
    private PlanoPacientePK id;


     //construtores + gets + sets + hashCode + equals

     public Paciente getPaciente() {
        return paciente;
    }

    public void setPaciente(Paciente paciente) {
        this.paciente = paciente;
    }

    public Plano getPlano() {
        return plano;
    }

    public void setPlano(Plano plano) {
        this.plano = plano;
    }

sendo q a 3ª forma faz o mapeamento errado, pois alem de criar as chaves compostas ele tb cria os atributos idPlano e idPaciente

as outras 2 formas mapeiam certinho

porem quando eu tento

Criteria crit = hibernateSession.createCriteria(PlanoPaciente.class, “p”);

List lista = (ArrayList) crit.list();
crit.add(Restrictions.eq(“p.plano.tipo”, tipo)) //tipo é uma varivel sendo passada por parametro para selecionar planos de um determinado tipo

exibe o seguinte erro em cada um das formas

Forma1: [color=red] Exception: org.hibernate.QueryException: could not resolve property: paciente of: model.PlanoPaciente [/color]

Forma2: [color=red] Exception: org.hibernate.QueryException: could not resolve property: paciente of: model.PlanoPaciente [/color]

Forma3: [color=red] Exception: org.hibernate.QueryException: could not resolve property: plano.nome of: model.PlanoPaciente [/color]

A classe “model.PlanoPaciente” está mapeada corretamente no “hibernate.cfg.xml”?

sim está